最大流问题:从源点到终点运送货物,经过一些中转站,中转站之间有路径连接,每条路径有运送货物量的上限,求最多能运送多少货物
找最大流就是每次找增广路径,并更新网络,直到找不到增广路径
#include<iostream> using namespace std; const int MAX = 201; const int inf = 0x3f3f3f3f; #define min(a,b) (a)<(b)?(a):(b) int vis[MAX],pre[MAX],que[MAX],map[MAX][MAX],n,ans; bool BFS(int s,int t){ //广度优先搜索 找增广路径 memset(vis,0,sizeof(vis)); int head = -1,tail = -1; que[++tail] = s; vis[s] = 1; int i,u; while(head != tail){ u = que[++head]; for(i = 0;i <= n;i++) { if(!vis[i]&&map[u][i]){ pre[i] = u; if(i == t) return true; que[++tail] = i; vis[i] = 1; } } } return false; } void end(int s,int t){ int i,sum = inf; for(i = t;i != s;i = pre[i]) //路径上最小的货物运送量 sum = min(sum,map[pre[i]][i]); for(i = t;i != s;i = pre[i]){ //逆向更新网络 map[pre[i]][i] -= sum; map[i][pre[i]] += sum; } ans += sum; } void EK(int s,int t){ while(BFS(s,t)) //直到找不到增广路径 { end(s,t); } } int main(){ int m; while(cin>>m>>n){ memset(map,0,sizeof(map)); int i,j,v,a,b; for(i = 0;i < m;i++){ cin>>a>>b>>v; map[a][b] += v; //可能有重边 } ans = 0; EK(1,n); cout<<ans<<endl; } return 0; }