#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<vector>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define endl '\n'constdouble pi =acos(-1);constint maxn =5e4+10;constint maxm =5e5+10;const ll mod =1e9+7;int n, m, s, t, cnt;int head[maxn], vis[maxn], dep[maxn];struct node{int to;int next;int quan;}edge[maxm <<1];voidadd(int u,int v,int w){
edge[cnt].to = v;
edge[cnt].quan = w;
edge[cnt].next = head[u];
head[u]= cnt ++;}intbfs(){memset(dep, INF,sizeof(dep));memset(vis,0,sizeof(vis));
queue<int> que;
que.push(s);
dep[s]=0;
vis[s]=1;while(!que.empty()){int u = que.front();
que.pop();
vis[u]=0;for(int i = head[u]; i !=-1; i = edge[i].next){int v = edge[i].to;if(dep[v]> dep[u]+1&& edge[i].quan){
dep[v]= dep[u]+1;if(vis[v]==0){
vis[v]=1;
que.push(v);}}}}return dep[t]== INF ?0:1;}intdfs(int u,int flow){int rlow =0;if(u == t)return flow;for(int i = head[u]; i !=-1; i = edge[i].next){int v = edge[i].to;if(dep[v]== dep[u]+1&& edge[i].quan){if(rlow =dfs(v,min(flow, edge[i].quan))){
edge[i].quan -= rlow;
edge[i^1].quan += rlow;return rlow;}}}return0;}intdinic(){int lowflow =0, maxflow =0;while(bfs()){//puts("44");while(lowflow =dfs(s, INF)) maxflow += lowflow;}return maxflow;}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);}printf("%d",dinic());return0;}