觊觎已久的dinic网络流~
果然还是晓犇讲代码神啊~~~@Starria
第一个板子就在这里开荒留下足迹吧w~
#include<cstdio>
#include<algorithm>
#define N 1100
#define INF 1000000000
using namespace std;
struct node{
long long to,len,nxt;
}table[N<<1];
long long tot=2,head[N],queue[N],l,r,n,m,S,T,ans=0;
void add(long long x,long long y,long long z){
table[tot].len=z,table[tot].to=y,table[tot].nxt=head[x],head[x]=tot++;
table[tot].len=0,table[tot].to=x,table[tot].nxt=head[y],head[y]=tot++;
return;
}
long long vis[N];
bool bfs(){
l=r=0;
for(long long i=0;i<=n;i++){
vis[i]=0;
}
vis[S]=1;
queue[r++]=S;
while(l!=r){
long long t=queue[l++];
for(long long i=head[t];i;i=table[i].nxt){
if((!vis[table[i].to])&&table[i].len){
vis[table[i].to]=vis[t]+1;
queue[r++]=table[i].to;
}
}
}
if(vis[T]){
return true;
}
return false;
}
long long dfs(long long x,long long val){
if(x==T){
return val;
}
long long res=0;
for(long long i=head[x];i;i=table[i].nxt){
if(table[i].len!=0&&vis[table[i].to]==vis[x]+1){
long long chg=dfs(table[i].to,min(val,table[i].len));
table[i].len-=chg,table[i^1].len+=chg,val-=chg,res+=chg;
}
}
return res;
}
int main(){
scanf("%lld%lld%lld%lld",&n,&m,&S,&T);
for(long long i=0;i<m;i++){
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
}
while(bfs()){ans+=dfs(S,INF);};
printf("%lld\n",ans);
return 0;
}