最大流dinic模板

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
const int maxn=1000;
const int inf=0x3f3f3f3f;
int head[maxn],level[maxn];
int num;
void init()
{
    num=-1  ;
    memset(head,-1,sizeof(head));
}
struct node
{
    int v,w,next;
}G[400000];
int bfs(int s,int t)
{
    queue<int>q;
    q.push(s);
    memset(level,-1,sizeof(level));
    level[s]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=G[i].next){
            int v=G[i].v;
            if(G[i].w>0&&level[v]==-1){
                level[v]=level[u]+1;
                q.push(v);
            }
        }
    }
   return level[t];
}
int dfs(int s,int t,int f)
{
    if(s==t) return f;
    int ans=0;
    for(int i=head[s];i!=-1;i=G[i].next){
        int v=G[i].v;
        if(G[i].w>0&&level[s]+1==level[v]){
            int d=dfs(v,t,min(G[i].w,f-ans));
            if(d>0){
                G[i].w-=d;
                G[i^1].w+=d;
                ans+=d;
                if(ans==f) return ans;
            }
        }
    }
    return ans;
}
int dinic(int s,int t)
{
    int ans=0;
    while(1){
        int temp=bfs(s,t);
        if(temp==-1) break;
        ans+=dfs(s,t,inf);
    }
    return ans;
}
void build(int u,int v,int w)
{
    num++;
    G[num].v=v;
    G[num].w=w;
    G[num].next=head[u];
    head[u]=num;

    num++;
    G[num].v=u;
    G[num].w=0;
    G[num].next=head[v];
    head[v]=num;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        init();
        int s,t;
        scanf("%d%d",&s,&t);
        t=t+n;
        int temp;
        for(int i=1;i<=n;i++){
            scanf("%d",&temp);
            build(i,i+n,temp);
        }
        for(int i=1;i<=m;i++){
            int u;int v;
            scanf("%d%d",&u,&v);
            build(u+n,v,inf);
            build(v+n,u,inf);
        }
        printf("%d\n",dinic(s,t));
    }
    return 0;
}

 

t

posted @ 2019-09-16 20:20  古比  阅读(176)  评论(0编辑  收藏  举报