网络流汇总,可以用的模板

来源:互联网 发布:什么叫品牌战略 知乎 编辑:程序博客网 时间: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;}

 

原创粉丝点击