1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 struct node 10 { 11 int to,pos,cap; 12 }; 13 const int MAXN=1100; 14 const int INF=0x7fffffff; 15 vector<node> E[MAXN]; 16 int m,n;//m:edges n:points 17 int d[MAXN]; 18 int vis[MAXN]; 19 20 void addedge(int u,int v,int w) 21 { 22 E[u].push_back((node){v,E[v].size(),w}); 23 E[v].push_back((node){u,E[u].size()-1,0}); 24 } 25 26 int bfs()//从源点开始进行分层 27 { 28 memset(d,-1,sizeof(d)); 29 d[1]=0; 30 queue<int> que; 31 que.push(1); 32 while (!que.empty()) 33 { 34 int head=que.front();que.pop(); 35 for (int i=0;i<E[head].size();i++) 36 { 37 node tmp=E[head][i]; 38 if (d[tmp.to]>=0|| tmp.cap<=0) continue; 39 d[tmp.to]=d[head]+1; 40 que.push(tmp.to); 41 } 42 } 43 if (d[n]>0) return 1; 44 else return 0; 45 } 46 47 int dfs(int s,int t,int f) 48 { 49 if (s==t) return f; 50 vis[s]=1; 51 for (int i=0;i<E[s].size();i++) 52 { 53 node &tmp=E[s][i]; 54 if (vis[tmp.to]==0 && tmp.cap>0 && d[tmp.to]==d[s]+1) 55 { 56 int delta=dfs(tmp.to,t,min(f,tmp.cap)); 57 if (delta>0) 58 { 59 tmp.cap-=delta; 60 E[tmp.to][tmp.pos].cap+=delta; 61 return delta; 62 } 63 } 64 } 65 return 0; 66 } 67 68 int main() 69 { 70 while (~scanf("%d%d",&m,&n)) 71 { 72 memset(E,0,sizeof(E)); 73 for (int i=0;i<m;i++) 74 { 75 int u,v,w; 76 scanf("%d%d%d",&u,&v,&w); 77 addedge(u,v,w); 78 } 79 80 int flow=0; 81 while (bfs()) 82 { 83 for (;;) 84 { 85 memset(vis,0,sizeof(vis)); 86 int f=dfs(1,n,INF); 87 if (f==0) break; 88 else flow+=f; 89 } 90 } 91 cout<<flow<<endl; 92 } 93 return 0; 94 }
【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches
原文:http://www.cnblogs.com/iiyiyi/p/5153504.html