网络流最大流dinic的板子

void add(int u,int v,int w){
    e[tot].v=v;
    e[tot].w=w;
    e[tot].nt=pre[u];
    pre[u]=tot++;
    e[tot].v=u;
    e[tot].w=0;
    e[tot].nt=pre[v];
    pre[v]=tot++;
}
bool bfs(){
    mt(dis,-1);
    dis[s]=0;
    queue<int> q;
    while(sz(q)) q.pop();
    q.push(s);
    while(sz(q)){
        int u=q.front();q.pop();
        for(int i=pre[u];~i;i=e[i].nt){
            int v=e[i].v,w=e[i].w;
            if(dis[v]==-1&&w>0){
                dis[v]=dis[u]+1;
                if(v==t) return 1;
                q.push(v);
            }
        }
    }
    return dis[t]!=-1;
}
int dfs(int u,int cp){
    if(u==t) return cp;
    int tmp=cp;
    for(int i=pre[u];~i;i=e[i].nt){
        int v=e[i].v,w=e[i].w;
        if(dis[v]==dis[u]+1&&w>0){
            int tt=dfs(v,min(tmp,w));
            e[i].w-=tt;
            e[i^1].w+=tt;
            tmp-=tt;
            if(tmp<=0) return cp;
        }
    }
    return cp-tmp;
}
int dinic(){
    int ret=0;
    while(bfs()) ret+=dfs(s,inf);
    return ret;
}
View Code

猜你喜欢

转载自www.cnblogs.com/chinacwj/p/8922812.html