1 /*
2 唐代杜荀鹤
3 《小松》
4 自小刺头深草里,而今渐觉出蓬蒿。
5 时人不识凌云木,直待凌云始道高。
6 */
7 #include <iostream>
8 #include <cstdio>
9 #include <algorithm>
10 #include <cstring>
11 #include <vector>
12 #include <utility>
13 #include <iomanip>
14 #include <string>
15 #include <cmath>
16 #include <queue>
17 #include <assert.h>
18 #include <map>
19 #include <ctime>
20 #include <cstdlib>
21 #include <stack>
22 #include <set>
23 #define LOCAL
24 const int INF = 0x7fffffff;
25 const int MAXN = 100000 + 10;
26 const int maxnode = 20000 * 2 + 200000 * 20;
27 const int MAXM = 50000 + 10;
28 const int MAX = 100;
29 using namespace std;
30 struct Edge{
31 int u, v, c, f;
32 void init(int a, int b, int d, int e){
33 u = a;v = b;
34 c = d;f = e;
35 }
36 }edges[MAXM];
37 int next[MAXN], M, cur[MAXN], vis[MAXN];
38 int dist[MAXN], head[MAXN], n, m, sta, end;
39
40 void addEdge(int u, int v, int c){
41 edges[M].init(u, v, c, 0);M++;
42 edges[M].init(v, u, 0, 0);//反向边
43 next[M - 1] = head[u];
44 head[u] = M - 1;
45 next[M] = head[v];
46 head[v] = M++;
47 return;
48 }
49 void init(){
50 M = 0;//总边数
51 memset(head, -1, sizeof(head));
52 scanf("%d%d", &n, &m);
53 for (int i = 1; i <= m; i++){
54 int u, v, c;
55 scanf("%d%d%d", &u, &v, &c);
56 addEdge(u, v, c);
57 }
58 sta = 1;
59 end = n;
60 }
61 bool bfs(){
62 memset(vis, 0, sizeof(vis));
63 queue<int>Q;
64 dist[sta] = 0;
65 vis[sta] = 1;
66 Q.push(sta);
67 while (!Q.empty()){
68 int u = Q.front();
69 Q.pop();
70 for (int i = head[u]; i != -1; i = next[i]){
71 int e = i, v = edges[e].v;
72 if (vis[v]) continue;
73 if (edges[e].c > edges[e].f){
74 vis[v] = 1;
75 dist[v] = dist[u] + 1;
76 Q.push(v);
77 }
78 }
79 }
80 return vis[end];
81 }
82 int dfs(int x, int a){
83 if (x == end || a == 0) return a;
84 int flow = 0, f;
85 if (cur[x] == -1) cur[x] = head[x];
86 for (int &i = cur[x]; i != -1; i = next[i]){
87 int e = i, v = edges[i].v;
88 if (dist[v] == dist[x] + 1 && (f = dfs(v, min(edges[e].c - edges[e].f, a))) > 0){
89 flow += f;
90 a -= f;
91 edges[e].f += f;
92 edges[e ^ 1].f -= f;
93 if (a == 0) break;
94 }
95 }
96 return flow;
97 }
98 int Dinic(){
99 int flow = 0;
100 while (bfs()){
101 memset(cur, -1, sizeof(cur));
102 flow += dfs(sta, INF);
103 }
104 return flow;
105 }
106
107 int main(){
108 #ifdef LOCAL
109 freopen("data.txt", "r", stdin);
110 freopen("out.txt", "w", stdout);
111 #endif
112 init();
113 printf("%d", Dinic());
114 //printf("%d", (a == c));
115 return 0;
116 }