POJ3228二分最大流

2021-06-29 04:02:59 字數 1710 閱讀 1562

題意:

有n個點,每個點有兩個權值,金子數量還有倉庫容量,金子可以存在自己的倉庫裡或者是別的倉庫裡,倉庫和倉庫之間有距離,問所有金子都必須存到庫里最大距離的最小是多少?

思路:比較簡單,方法也不唯一,大體可以這樣,先二分,然後用最大流或者匹配..來判斷是不是滿足就行了,我用的是二分最大流,具體**在下面。

#include

#include

#include

#include

#define n_node 400 + 50

#define n_edge 200 * 200 * 2 + 10000

#define inf 1000000000

using namespace std;

typedef struct

star;

typedef struct

edge;

typedef struct

dep;

star e[n_edge];

edge edge[n_edge];

dep xin ,tou;

int list[n_node] ,listt[n_node] ,tot;

int deep[n_node];

int c1[n_node] ,c2[n_node];

int num[n_edge] ,numt[n_edge];

void add(int a ,int b ,int c)

bool bfs_deep(int s ,int t ,int n)

}for(int i = 0 ;i <= n ;i ++)

listt[i] = list[i];

return deep[t] != -1;

}int minn(int x ,int y)

int dfs_flow(int s, int t ,int flow)

if(!nowflow) deep[s] = 0;

return nowflow;

}int dinic(int s ,int t ,int n)

return ans;

}int getmaxflow(int mid ,int n ,int m)

for(int i = 1 ;i <= m ;i ++)

}return dinic(0 ,n + n + 1 ,n + n + 1);

}int main ()

for(i = 1 ;i <= n ;i ++)

scanf("%d" ,&m);

for(i = 1 ;i <= m ;i ++)

if(s2 < s1)

sort(numt + 1 ,numt + m + 1);

int numid = 0;

for(i = 1 ;i <= m ;i ++)

if(i == 1 || numt[i] != numt[i-1])

num[++numid] = numt[i];

num[0] = 0;

int low = 0 ,up = numid ,mid ,ans = -1;

while(low <= up)

else low = mid + 1;

}if(ans == -1) printf("no solution\n");

else printf("%d\n" ,ans);

}return 0;

}

poj 3228 二分 最大流 dinic

有n座town 每座town都有一定數量gold和倉庫 倉庫的容量是有限的 有m條雙向路徑 求把所有的gold 運到倉庫最小的最大距離是多少 思路 增設乙個超級源點和乙個超級匯點,源點與每乙個gold相連,容量為gold數量,匯點與倉庫相連,容量為倉庫的容量,然後就是二分最小的最大相鄰距離,跑最大流...

hdu 3228 最大流 二分

題意 一共有n個城市,一些城市裡有金礦,一些城市裡有倉庫,金礦和倉庫都有乙個容量,有m條邊,每條邊是雙向的,有乙個權值,求將所有金礦裡的儲量都運送到倉庫中,所需要經過的道路中,使最大的權值最小 思路 增設乙個超級源點和乙個超級匯點,源點與每乙個城市相連,容量為 數量,匯點與倉庫相連,容量為倉庫的容量...

poj 2112 最大流 二分

題意 有k臺擠奶機,c頭奶牛,給出這k c個實體間的距離,求出每頭奶牛都到一台擠奶機去,怎麼分配使奶牛走的最大距離最小。用二分列舉最大距離,include include define n 500 define inf 0x3fffffff int map n n dis n gap n head ...