原题:https://www.luogu.org/problemnew/show/P3376
题解:s到t的最大流。dinic模板。
#include<bits/stdc++.h>
#define inf (1<<31)-1
using namespace std;
const int N=10010;
const int M=100010;
struct E{int to,nxt,w;}data[M<<1];
int n,m,s,t,len=1;
int h[N],cur[N],dep[N];
queue<int> Q;
inline int rd(){
int x=0;int f=1;char s=getchar();
while(!isdigit(s)) f=(s=='-'?-1:f),s=getchar();
while(isdigit(s)) x=(x<<1)+(x<<3)+s-'0',s=getchar();
return x*f;
}
inline void ins(int x,int y,int w){
data[++len].to=y;data[len].w=w;data[len].nxt=h[x];h[x]=len;
data[++len].to=x;data[len].w=0;data[len].nxt=h[y];h[y]=len;
}
bool bfs(){
//层次图
while(!Q.empty()) Q.pop();
memset(dep,0,sizeof dep);
dep[s]=1;Q.push(s);
while(!Q.empty()){
int x=Q.front();Q.pop();
for(int i=h[x];i;i=data[i].nxt){
int y=data[i].to;int w=data[i].w;
if(w!=0 && dep[y]==0){//
dep[y]=dep[x]+1;
Q.push(y);
}
}
}
if(dep[t]>0) return 1;
else return 0;
}
int dfs(int x,int lim){//求增广路
if(x==t) return lim;
for(int &i=cur[x];i;i=data[i].nxt){
int y=data[i].to;int w=data[i].w;
if(dep[y]==dep[x]+1 && w!=0){
int di=dfs(y,min(lim,w));//if(!di) continue;
if(di>0){
data[i].w-=di;
data[i^1].w+=di;
return di;
}
}
}
return 0;
}
inline int dinic(){
int ans=0;
while(bfs()){
for(int i=1;i<=n;i++) cur[i]=h[i];//当前弧优化
while(int d=dfs(s,inf)) ans+=d;
}
return ans;
}
int main(){
n=rd();m=rd();s=rd();t=rd();
for(int i=1,x,y,w;i<=m;i++){
x=rd();y=rd();w=rd();ins(x,y,w);
}
printf("%d\n",dinic());
return 0;
}