1 #include<iostream>
2 /*
3 题意:就是寻找从源点到汇点的最大流!
4 要注意的是每两个点的流量可能有多个,也就是说有重边,所以要把两个点的所有的流量都加起来
5 就是这两个点之间的流量了!
6
7 思路:建图之后直接套用最大流算法(EK, 或者是Dinic算法) 图解Dinic算法流程!
8 */
9 #include<queue>
10 #include<cstring>
11 #include<cstdio>
12 #include<algorithm>
13 #define INF 0x3f3f3f3f3f3f3f3f
14 #define N 205
15 using namespace std;
16 typedef long long LL;
17 LL cap[N][N];
18
19 int m, n;
20 LL maxFlow;
21 int d[N];
22 queue<int>q;
23
24 bool bfs(){
25 q.push(1);
26 memset(d, 0, sizeof(d));
27 d[1]=1;
28 while(!q.empty()){
29 int u=q.front();
30 q.pop();
31 for(int v=1; v<=n; ++v)
32 if(!d[v] && cap[u][v]>0){
33 d[v]=d[u]+1;
34 q.push(v);
35 }
36 }
37 if(!d[n]) return false;
38 return true;
39 }
40
41 LL dfs(int u, LL flow){
42 if(u==n) return flow;
43 for(int v=1; v<=n; ++v)
44 if(d[v]==d[u]+1 && cap[u][v]>0){
45 LL a=dfs(v, min(flow, cap[u][v]));
46 if(a==0) continue;//如果a==0 说明没有找到从起点到汇点的增广路, 然后换其他路接着寻找!
47 cap[u][v]-=a;
48 cap[v][u]+=a;
49 return a;
50 }
51 return 0;
52 }
53
54 void Dinic(){
55 LL flow;
56 while(bfs()){//利用bfs构造好层次图,这样dfs在寻找阻塞流的时候,就不会盲目的寻找了!
57 while(flow=dfs(1, INF)) maxFlow+=flow;//利用构造好的层次图不断的寻找阻塞流!
58 }
59 }
60
61 int main(){
62 while(scanf("%d%d", &m, &n)!=EOF){
63 memset(cap, 0, sizeof(cap));
64 while(m--){
65 int u, v;
66 LL w;
67 scanf("%d%d%lld", &u, &v, &w);
68 cap[u][v]+=w;
69 }
70 maxFlow=0;
71 Dinic();
72 printf("%lld
", maxFlow);
73 }
74 return 0;
75 }
1 //EK算法同样搞定
2 #include<iostream>
3 #include<queue>
4 #include<cstdio>
5 #include<cstring>
6 #include<algorithm>
7 #define INF 0x3f3f3f3f
8 using namespace std;
9 typedef __int64 LL;
10 LL cap[205][205];
11 int pre[205];
12 LL a[205];
13 int m, n;
14 queue<int>q;
15 LL maxFlow;
16 bool spfa(){
17 while(!q.empty()) q.pop();
18 memset(a, 0, sizeof(a));
19 q.push(1);
20 a[1]=INF;
21 while(!q.empty()){
22 int u=q.front();
23 q.pop();
24 for(int v=1; v<=n; ++v)
25 if(!a[v] && cap[u][v]>0){
26 pre[v]=u;
27 a[v]=min(a[u], cap[u][v]);
28 q.push(v);
29 }
30 if(a[n]) break;
31 }
32 if(!a[n]) return false;
33 return true;
34 }
35
36 void EK(){
37 maxFlow=0;
38 while(spfa()){
39 int u=n;
40 maxFlow+=a[n];
41 while(u!=1){
42 cap[pre[u]][u]-=a[n];
43 cap[u][pre[u]]+=a[n];
44 u=pre[u];
45 }
46 }
47 }
48 int main(){
49 while(scanf("%d%d", &m, &n)!=EOF){
50 memset(cap, 0, sizeof(cap));
51 while(m--){
52 int u, v;
53 LL w;
54 scanf("%d%d%I64d", &u, &v, &w);
55 cap[u][v]+=w;
56 }
57 EK();
58 printf("%I64d
", maxFlow);
59 }
60 return 0;
61 }