网络流DINIC模板

int n,m,k,S,T;
int head[N],hcnt,lel[N],cur[N];
struct Node{int to,nxt,v;}node[maxn];
inline void add(int x,int y,int v){
    node[hcnt].to=y;node[hcnt].nxt=head[x];node[hcnt].v=v;head[x]=hcnt++;
    node[hcnt].to=x;node[hcnt].nxt=head[y];node[hcnt].v=0;head[y]=hcnt++;
}
int bfs(){
    mst(lel,-1);lel[S]=0;
    queue<int>q;q.push(S);
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=head[x];~i;i=node[i].nxt){
            int e=node[i].to;
            if(lel[e]!=-1||!node[i].v)continue;
            lel[e]=lel[x]+1;
            if(e==T)return 1;
            q.push(e);
        }
    }
    return 0;
}
int dfs(int x,int f){
    if(x==T)return f;
    int fl,ret=0,e;
    for(int i=cur[x];~i;i=node[i].nxt){
        e=node[i].to;
        if(lel[e]==lel[x]+1){
            fl=f-ret;
            fl=dfs(e,min(fl,node[i].v));
            ret+=fl;
            node[i].v-=fl;node[i^1].v+=fl;
            if(f==ret)return f;
        }
    }
    if(!ret)lel[x]=-1;
    return ret;
}
int dinic(){
    int ans=0;
    while(bfs()){
        mcp(cur,head);
        ans+=dfs(S,inf);
    }
    return ans;
}

 

posted @ 2016-04-09 08:40  Kurokey  阅读(600)  评论(1编辑  收藏  举报