題意:
有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 ...