1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int MAXN=1100; 10 const int INF=0x7fffffff; 11 int n,m;//n:edges,m:points 12 struct node 13 { 14 int to,pos,cap; 15 }; 16 vector<node> E[MAXN]; 17 int vis[MAXN]; 18 19 void addedge(int u,int v,int w) 20 { 21 node x; 22 x.to=v; x.pos=E[v].size(); x.cap=w; 23 E[u].push_back(x); 24 x.to=u; x.pos=E[u].size()-1; x.cap=0; 25 E[v].push_back(x); 26 } 27 28 int dfs(int s,int t,int f) 29 { 30 int ret=0; 31 if (s==t) return f; 32 vis[s]=1;//不要忘记这里要设置为访问过 33 for (int i=0;i<E[s].size();i++) 34 { 35 node &tmp=E[s][i]; 36 if (vis[tmp.to]==0 && tmp.cap>0) 37 { 38 int delta=dfs(tmp.to,t,min(tmp.cap,f)); 39 if (delta>0) 40 { 41 ret+=delta; 42 tmp.cap-=delta; 43 E[tmp.to][tmp.pos].cap+=delta; 44 f-=delta; 45 } 46 } 47 } 48 return ret; 49 } 50 51 int maxflow(int u,int v) 52 { 53 int flow=0; 54 for (;;) 55 { 56 memset(vis,0,sizeof(vis)); 57 int f=dfs(u,v,INF); 58 if (f==0) return flow; 59 else flow+=f; 60 } 61 } 62 63 int main() 64 { 65 while(~scanf("%d%d",&n,&m)) 66 { 67 memset(E,0,sizeof(E)); 68 for (int i=0;i<n;i++) 69 { 70 int x,y,z; 71 scanf("%d%d%d",&x,&y,&z); 72 addedge(x,y,z); 73 } 74 cout<<maxflow(1,m)<<endl; 75 } 76 return 0; 77 }
2016/3/6更正:建立一个ret,每次递归不是找到一条增广路径就返回的..之前写的和FordFulkerson效率超不多orz