hdu 1532 EK模板2 0是原点m是汇点
#include <iostream> #include <string.h> using namespace std; #include <queue> #define min(x,y) (x<y?x:y) const int inf = 1000000000; const int maxn = 210; int cap[maxn][maxn]; int n,m; int s,t; int flow[maxn][maxn],d[maxn],parent[maxn],maxflow; void Edmonds_Karp(int s,int t,int nnum) { maxflow = 0; memset(flow,0,sizeof(flow)); memset(parent,0,sizeof(parent)); while(true) { memset(d,0,sizeof(d)); queue<int>que; d[s]=inf; que.push(s); while(!que.empty()) //BFS寻找增广路 { int u = que.front(); que.pop(); for(int v=0; v<nnum; ++v) { if(!d[v] && cap[u][v]>flow[u][v]) //找到新结点v { parent[v] = u; //记录v的父亲,并参加FIFO队列 que.push(v); d[v] = min(d[u],cap[u][v]-flow[u][v]); //s-v路径上的最小残量 } } } if(0==d[t]) //找不到,则当前流已经是最大流 break; for(int u=t;u!=s;u=parent[u]) //从汇点往回走 { flow[parent[u]][u]+=d[t]; //更新正向流 flow[u][parent[u]]-=d[t]; //更新反向流 } maxflow += d[t]; //更新从s流出的总流量 } } int main() { while(cin>>n>>m) { memset(cap,0,sizeof(cap)); while(n--) { int temps,tempe,c; cin>>temps>>tempe>>c; cap[temps-1][tempe-1]+=c; //处理惩罚重边 } Edmonds_Karp(0,m-1,m); cout<<maxflow<<endl; } return 0; }