网络流DINIC算法(模板)

来源:互联网 发布:桌面主题软件哪个好 编辑:程序博客网 时间:2024/06/06 12:33

https://daniu.luogu.org/problem/show?pid=3376

代码

#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<queue>using namespace std;const int maxx=10001;int n,m,s,t,flow=0;int be[maxx],ne[maxx*20],to[maxx*20],w[maxx*20],dep[maxx],e=1;void add(int x,int y,int z){to[++e]=y;ne[e]=be[x];be[x]=e;w[e]=z;}bool bfs(){queue<int> q;q.push(s);memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty()){int now=q.front();q.pop();for(int i=be[now];i;i=ne[i]){int go=to[i];if(!dep[go] && w[i]>0){//printf("%d~%d\n",go,w[i]);dep[go]=dep[now]+1;q.push(go);}}}return !dep[t]?0:1;}int dfs(int id,int mini){if(id==t || !mini)return mini;int flow,ret=0;for(int i=be[id];i;i=ne[i]){int go=to[i];if(w[i]>0 && dep[go] == dep[id]+1 && (flow=dfs(go,min(mini,w[i])))){w[i]-=flow;w[i^1]+=flow;ret+=flow;mini-=flow;}if(!mini)return ret;}return ret;}int dinic(){int ans=0;while(bfs()){while(1){int tmp=dfs(s,1e9);if(!tmp)break;ans+=tmp;//printf("%d\n",tmp);}}return ans;}int read(){char x;while((x=getchar())<'0' || x>'9');int u=x-'0';while((x=getchar())>='0' && x<='9')u=u*10+x-'0';return u;}int main(){#ifndef ONLINE_JUDGEfreopen("input.in","r",stdin);freopen("output.out","w",stdout);#endifint i,j,k;n=read();m=read();s=read();t=read();while(m--){i=read();j=read();k=read();add(i,j,k);add(j,i,0);}printf("%d",dinic());return 0;}