dinic 模板

来源:互联网 发布:js怎么给input赋值 编辑:程序博客网 时间:2024/05/16 09:24
int dinic_d[maxn];bool dinic_vis[maxn];struct edge{    int v,next,c;}e[maxe];int head[maxn],tol , s , t;void dinic_init(){    tol=0;    memset(head,-1,sizeof head);}void AddEdge(int u,int v,int c){    e[tol].v=v,e[tol].c=c,e[tol].next=head[u],head[u]=tol++;    e[tol].v=u,e[tol].c=0,e[tol].next=head[v],head[v]=tol++;}bool bfs(){    memset(dinic_d,0,sizeof dinic_d);    memset(dinic_vis,0,sizeof dinic_vis);    queue<int> q;    q.push(s);    dinic_vis[s]=1;    while(!q.empty()){        int u=q.front();        q.pop();        for(int i=head[u];i!=-1;i=e[i].next){            int v=e[i].v;            if(e[i].c&&!dinic_vis[v]){                dinic_vis[v]=1;                dinic_d[v]=dinic_d[u]+1;                q.push(v);            }        }    }    return dinic_vis[t];}int dfs(int x,int pf){    if(x==t) return pf;    else{        int ret=0;        for(int i=head[x];i!=-1&&pf;i=e[i].next){            int v=e[i].v;            if(e[i].c&&dinic_d[v]==dinic_d[x]+1){                int d=dfs(v,min(e[i].c,pf));                e[i].c-=d;                e[i^1].c+=d;                pf-=d;                ret+=d;            }        }if(!ret) dinic_d[x] = -2;        return ret;    }}int dinic(){    int ret=0;    while(bfs()){        ret+=dfs(s,INF);    }    return ret;}////////////////////////////

0 0
原创粉丝点击