网络流汇总,可以用的模板
来源:互联网 发布:什么叫品牌战略 知乎 编辑:程序博客网 时间:2024/05/19 16:32
#include<bits/stdc++.h>#define maxn 1920480using namespace std;struct Edge{int to,w,next;}e[maxn];int head[maxn],cur[maxn],gap[maxn],h[maxn],level[maxn];int n,m,s,t;int cnt=0;void add(int u,int v,int w){e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;}int bfs(){queue<int> q;memset(level,-1,sizeof(level));//important q.push(s);level[s]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=head[x];~i;i=e[i].next){int j=e[i].to;if(level[j]==-1&&e[i].w){level[j]=level[x]+1;q.push(j);}}}return !(level[t]==-1);}int dinic(int now,int flow){if(now==t) return flow;int res=0;for(int i=cur[now];~i;i=e[i].next)//!{int j=e[i].to;if(level[now]+1==level[j]&&e[i].w){int f=dinic(j,min(flow-res,e[i].w));e[i].w-=f,e[i^1].w+=f,res+=f;if(res==flow) return flow;if(e[i].w) cur[now]=i;//!}}if(!res) level[now]=-1;return res;}int main(){ cin>>n>>m>>s>>t; memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int t1,t2,t3;cin>>t1>>t2>>t3;add(t1,t2,t3),add(t2,t1,0);}int ans=0;while(bfs()){for(int i=1;i<=n;i++) cur[i]=head[i];while(int tmp=dinic(s,1e9))ans+=tmp;}cout<<ans<<endl; return 0;}
#include<bits/stdc++.h>#define maxn 1920480using namespace std;struct Edge{int to,w,next;}e[maxn];int head[maxn],cur[maxn],gap[maxn],h[maxn];int n,m,s,t;int cnt=0;void add(int u,int v,int w){e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;}int isap(int x,int flow){ if(x==t) return flow; int res=0; for(int i=cur[x];~i;i=e[i].next) { int j=e[i].to; if(h[x]==h[j]+1&&e[i].w) { int f=isap(j,min(e[i].w,flow-res)); e[i].w-=f,e[i^1].w+=f,res+=f; if(res==flow) return flow; if(e[i].w) cur[x]=i; } } --gap[h[x]]; if(gap[h[x]]==0) h[s]=n+2; gap[++h[x]]++; cur[x]=head[x]; return res;}int main(){ cin>>n>>m>>s>>t; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++) { int t1,t2,t3; cin>>t1>>t2>>t3; add(t1,t2,t3),add(t2,t1,0); } int ans=0; for(int i=1;i<=n;i++) cur[i]=head[i]; while(h[s]<n+2) ans+=isap(s,1e9); cout<<ans<<endl; return 0;}