#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<vector>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3fconstdouble pi =acos(-1);constint maxn =1e4+10;constint maxm =1e5+10;const ll mod =1e9+7;int ans, cnt, m, n, s, t;int head[maxn], vis[maxn];struct node{int to;int next;int quan;}edge[maxm <<1];struct nod{int uu;int eg;}pre[maxn];voidadd(int u,int v,int w){
edge[cnt].to = v;
edge[cnt].quan = w;
edge[cnt].next = head[u];
head[u]= cnt ++;}boolbfs(){
queue<int> que;memset(vis,0,sizeof(vis));memset(pre,-1,sizeof(pre));
vis[s]=1;
que.push(s);while(!que.empty()){int u = que.front();
que.pop();for(int i = head[u]; i !=-1; i = edge[i].next){int v = edge[i].to;if(!vis[v]&& edge[i].quan){
pre[v].uu = u;
pre[v].eg = i;if(v == t)returntrue;
vis[v]=1;
que.push(v);}}}returnfalse;}intmain(){int u, v, w;scanf("%d %d %d %d",&n,&m,&s,&t);memset(head,-1,sizeof(head));for(int i =1; i <= m ;++ i){scanf("%d %d %d",&u,&v,&w);add(u, v, w);add(v, u,0);}while(bfs()){int mini = INF;for(int i = t ; i != s ; i = pre[i].uu){
mini =min(mini, edge[pre[i].eg].quan);}for(int i = t ; i != s ; i = pre[i].uu){
edge[pre[i].eg].quan -= mini;
edge[pre[i].eg^1].quan += mini;}
ans += mini;}printf("%d", ans);return0;}
Dinic
#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<string>#include<vector>#include<set>#include<bitset>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define LINF 0x3f3f3f3f3f3f3f3f#define ull unsigned long long#define endl '\n'#define clr_0(a) memset(a, 0, sizeof(a))#define clr_INF(a) memset(a, INF, sizeof(a))#define lowbit(x) x & -x#define lson rt << 1, l, mid#define rson rt << 1 | 1, mid + 1, r#define PB push_back#define POP pop_backconstdouble pi =acos(-1);constint maxn =2e5;constint maxm =4e5;const ll mod =998244353;constint hash_mod =19260817;int n, m, s, t, cnt, maxflow;int head[maxn], dep[maxn], cur[maxn], inq[maxn];struct node{int to, next, quan;}edge[maxm <<1];struct nod{voidadd(int u,int v, ll w){
edge[cnt].to = v;
edge[cnt].quan = w;
edge[cnt].next = head[u];
head[u]= cnt ++;}boolbfs(){for(int i =1; i <= n ;++ i) cur[i]= head[i], dep[i]= INF, inq[i]=0;
queue<int> que;
que.push(s);
inq[s]=1;
dep[s]=0;while(!que.empty()){int u = que.front();
que.pop();
inq[u]=0;for(int i = head[u];~ i ; i = edge[i].next){int v = edge[i].to;if(edge[i].quan && dep[v]> dep[u]+1){
dep[v]= dep[u]+1;if(!inq[v]){
inq[v]=1;
que.push(v);}}}}return dep[t]== INF ?0:1;}intdfs(int u,int flow){int rlow =0;if(u == t){
maxflow += flow;return flow;}int used =0;for(int i = cur[u];~ i ; i = edge[i].next){
cur[u]= i;int v = edge[i].to;if(edge[i].quan && dep[v]== dep[u]+1){if(rlow =dfs(v,min(flow - used, edge[i].quan))){
used += rlow;
edge[i].quan -= rlow;
edge[i^1].quan += rlow;if(used == flow)break;}}}return used;}voidsolve(){while(bfs()){dfs(s, INF);}}}dinic;intmain(){int u, v, w, T;
maxflow =0;
cnt =0;scanf("%d %d %d %d",&n,&m,&s,&t);memset(head,-1,sizeof(head));for(int i =1; i <= m ;++ i){scanf("%d %d %d",&u,&v,&w);
dinic.add(u, v, w); dinic.add(v, u,0);}
dinic.solve();
cout << maxflow << endl;return0;}