1 #include<stdio.h>
2 #include<string.h>
3 #include<cmath>
4 #include<algorithm>
5 #include<vector>
6 #include<queue>
7 #define inf 0x3f3f3f3f
8 using namespace std;
9 int min(int xx,int yy)
10 {
11 if (xx<yy) return xx;
12 return yy;
13 }
14 struct Edge
15 {
16 int from,to,cap,flow;
17 };
18 vector<Edge>edges;
19 vector<int>G[205];
20 int s,t;
21 int vis[205],d[205],cur[205];//d[]为层次即距离,cur[]为当前弧下标,vis[]有没有访问过
22
23 void addedge(int from,int to,int cap)
24 {
25 Edge edge1,edge2;
26 edge1.from=from; edge1.to=to; edge1.cap=cap; edge1.flow=0;
27 edge2.from=to; edge2.to=from; edge2.cap=edge2.flow=0;
28 edges.push_back(edge1);
29 edges.push_back(edge2);
30 int m=edges.size();
31 G[from].push_back(m-2);
32 G[to].push_back(m-1);
33 }
34 int bfs()
35 {
36 memset(vis,0,sizeof(vis));
37 queue<int>q;
38 Edge e;
39 q.push(s);
40 d[s]=0;
41 vis[s]=1;
42 while (!q.empty())
43 {
44 int x=q.front();
45 q.pop();
46 for (int i=0; i<G[x].size(); i++)
47 {
48 Edge& e=edges[G[x][i]];
49 if (!vis[e.to]&&e.cap>e.flow)
50 {
51 vis[e.to]=1;
52 d[e.to]=d[x]+1;
53 q.push(e.to);
54 }
55 }
56 }
57 return vis[t];
58 }
59 int dfs(int x,int a)
60 {
61 if (x==t||a==0) return a;
62 int flow=0,f;
63 Edge e;
64 for (int& i=cur[x]; i<G[x].size(); i++)
65 {
66 Edge& e=edges[G[x][i]];
67 if (d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)
68 {
69 e.flow+=f;
70 edges[G[x][i]^1].flow-=f;
71 flow+=f;
72 a-=f;
73 if (a==0) break;
74 }
75 }
76 return flow;
77 }
78 int main()
79 {
80 int flow,i,n,m,p,q,x;
81 while (~scanf("%d%d",&m,&n))
82 {
83 edges.clear();
84 for (i=1; i<=n; i++) G[i].clear();
85 for (i=1; i<=m; i++)
86 {
87 scanf("%d%d%d",&p,&q,&x);
88 addedge(p,q,x);
89 }
90 s=1;
91 t=n;
92 flow=0;
93 while (bfs())
94 {
95 memset(cur,0,sizeof(cur));
96 flow+=dfs(s,inf);
97 }
98 printf("%d\n",flow);
99 }
100 }
http://acm.hdu.edu.cn/showproblem.php?pid=1532