Dinic 模板

来源:互联网 发布:qq音乐网站源码 编辑:程序博客网 时间:2024/06/01 09:23

最大流之Dinic 模板

(————————————洛谷P3376)

#include<bits/stdc++.h>#define maxn 1000005#define inf 2147483647using namespace std;int n,S,T,m,num_e=1,ans;int head[maxn],dis[maxn];struct edge{    int to,nex,rest;}e[maxn];void add_edge(int x,int y,int v){    e[++num_e].to=y;e[num_e].nex=head[x];head[x]=num_e;e[num_e].rest=v;    e[++num_e].to=x;e[num_e].nex=head[y];head[y]=num_e;e[num_e].rest=0;}bool bfs(){    memset(dis,0,sizeof(dis));    queue<int> q;    q.push(S);    dis[S]=1;    while(!q.empty()){        int x=q.front();q.pop();        for(int i=head[x];i;i=e[i].nex){            int y=e[i].to;            if(!dis[y]&&e[i].rest) dis[y]=dis[x]+1,q.push(y);        }    }    if(dis[T]) return true;    return false;}int dfs(int x,int minn){    if(x==T) return minn;    int sum=0,qaq=0;    for(int i=head[x];i;i=e[i].nex){        int y=e[i].to;        if(dis[y]==dis[x]+1&&e[i].rest){            qaq=dfs(y,min(minn-sum,e[i].rest));            e[i].rest-=qaq;            e[i^1].rest+=qaq;            sum+=qaq;            if(sum==minn) return sum;        }    }    if(!sum) dis[x]=0;    return sum;}int dinic(){    int anss=0;    while(bfs()) anss+=dfs(S,inf);    return anss;}int main(){    scanf("%d%d%d%d",&n,&m,&S,&T);    int a,b,c;    for(int i=1;i<=m;i++){        scanf("%d%d%d",&a,&b,&c);        add_edge(a,b,c);    }    ans=dinic();    printf("%d",ans);    return 0;}
原创粉丝点击