![]()
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <queue>
5 using namespace std;
6 const int INF = 0x3f3f3f3f;
7 const int N = 10005;
8 const int M = 100005;
9 struct type{
10 int u, v, w, next;
11 }edge[M << 1];
12 int head[N], cnt;
13 int dep[N], cur[N];
14 int n, m, s, t, d;
15 void add(int x, int y, int z){
16 edge[cnt].u = x;
17 edge[cnt].v = y;
18 edge[cnt].w = z;
19 edge[cnt].next = head[x];
20 head[x] = cnt;
21 cnt++;
22 }
23 bool bfs(){
24 int fro = 0;
25 queue<int> q;
26 q.push(s);
27 for(int i = 1; i <= n; i++) dep[i] = 0;
28 dep[s] = 1;//important!!!!!
29 while(!q.empty()){
30 fro = q.front(); q.pop();
31 for(int i = head[fro]; i != -1; i = edge[i].next){
32 int vv = edge[i].v;
33 if(!dep[vv] && edge[i].w > 0){
34 dep[vv] = dep[fro] + 1;
35 q.push(vv);
36 }
37 }
38 }
39 return dep[t] ? 1 : 0;
40 }
41 int dfs(int x, int rest){
42 if(x == t || !rest) return rest;
43 for(int& i = cur[x]; i != -1; i = edge[i].next){//当前弧优化
44 int vv = edge[i].v, ww = edge[i].w;
45 if(dep[vv] != dep[x] + 1) continue;
46 d = dfs(vv, min(rest, ww));
47 if(d > 0){
48 edge[i].w -= d;
49 edge[i ^ 1].w += d;
50 return d;
51 }
52 }
53 return 0;
54 }
55 int dinic(){
56 int ans = 0;
57 while(bfs()){
58 for(int i = 1; i <= n; i++) cur[i] = head[i];//当前弧优化
59 if(d = dfs(s, INF)){
60 ans += d;
61 }
62 }
63 return ans;
64 }
65 int main() {
66 int x, y, z;
67 scanf("%d%d%d%d", &n, &m, &s, &t);
68 for(int i = 1; i <= n; i++) head[i] = -1;
69 for(int i = 1; i <= m; i++){
70 scanf("%d%d%d", &x, &y, &z);
71 add(x, y, z);
72 add(y, x, 0);
73 }
74 printf("%d", dinic());
75 return 0;
76 }
最大流dinic