1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include<bits/stdc++.h> #define RG register #define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout); #define clear(x, y) memset(x, y, sizeof(x)); using namespace std;
inline int read() { int data=0, w=1; char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') w=-1, ch=getchar(); while(ch>='0'&&ch<='9') data=(data<<3)+(data<<1)+(ch^48), ch=getchar(); return data*w; }
const int maxn(10010), maxm(1e5+10), I(2147483647); int n, m, s, t; struct edge { int next, to, cap; } e[maxm << 1]; int head[maxn], e_num, q[maxn], tail, lev[maxn], cur[maxn]; inline void add_edge(int from, int to, int cap) { e[e_num]={head[from], to, cap}; head[from]=e_num++; } inline void add(int from, int to, int cap) { add_edge(from, to, cap); add_edge(to, from, 0); }
inline bool bfs() { clear(lev, 0); q[tail=lev[s]=1]=s; for(RG int i=1;i<=tail;i++) { int x=q[i]; for(RG int j=head[x];~j;j=e[j].next) { int to=e[j].to; if(lev[to] || (!e[j].cap)) continue; q[++tail]=to; lev[to]=lev[x]+1; } } return lev[t]; }
int dfs(int x, int f) { if(x==t) return f; int ans=0, cap; for(RG int &i=cur[x];~i;i=e[i].next) { int to=e[i].to; if(e[i].cap && lev[to]==lev[x]+1) { cap=dfs(to, min(f-ans, e[i].cap)); e[i].cap-=cap; e[i^1].cap+=cap; ans+=cap; if(ans==f) break; } } return ans; }
inline int dinic() { RG int ans=0; while(bfs()) { for(RG int i=1;i<=n;i++) cur[i]=head[i]; ans+=dfs(s, I); } return ans; }
int fr, to, c; int main() { clear(head, -1); n=read(); m=read(); s=read(); t=read(); for(RG int i=1;i<=m;i++) fr=read(), to=read(), c=read(), add(fr, to, c); return printf("%d\n", dinic())&0; }
|