【模板】最大流Dinic算法

版权声明:转载请声明出处,谢谢配合。 https://blog.csdn.net/zxyoi_dreamer/article/details/81874107

参考题目:loj101


解析:

z x y o i 什么时候有时间什么时候更新系列。。。


代码:

#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define ull unsigned long long
#define itn int
#define gc getchar
#define il inline

il
ll getint(){
    ll num=0;
    char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);c=gc())num=(num<<1)+(num<<3)+(c^48);
    return num;
}

il
void outint(const ll &a){
    if(a<0)return putchar('-'),outint(-a);
    if(a>9)outint(a/10);
    putchar((a%10)^48); 
}
int n,m;
int Last[105],nxt[10005],to[10005],ecnt=1;
ll cap[10005];

il
void addedge(int u,int v ,ll val){
    nxt[++ecnt]=Last[u],Last[u]=ecnt,to[ecnt]=v,cap[ecnt]=val;
    nxt[++ecnt]=Last[v],Last[v]=ecnt,to[ecnt]=u,cap[ecnt]=0;
}

int s=1,t,lev[205],cur[205];

il
bool BFS(){
    queue<int> q;
    fill(lev,lev+n+1,-1);
    for(int re i=1;i<=n;++i)cur[i]=Last[i];
    q.push(s),lev[s]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int re e=Last[u],v=to[e];e;e=nxt[e],v=to[e]){
            if(cap[e]&&lev[v]==-1){
                lev[v]=lev[u]+1;
                if(v==t)return true;
                q.push(v);
            }
        }
    }
    return false;
}

il
ll Dinic(const int &u,const ll &flow){
    if(u==t)return flow;
    ll ans=0;
    for(int &e=cur[u],v=to[e];e;e=nxt[e],v=to[e]){
        if(cap[e]>0&&lev[u]<lev[v]){
            ll delta=Dinic(v,min((long long)cap[e],flow-ans));
            if(delta){
                cap[e]-=delta;
                cap[e^1]+=delta;
                ans+=delta;
                if(ans==flow)break;
            }
        }
    }
    if(ans!=flow)lev[u]=-1;
    return ans;
}

il
ll maxflow(){
    ll ans=0;
    while(BFS())ans+=Dinic(s,(1ll<<61));
    return ans;
} 

int main(){
    n=getint();
    m=getint();
    s=getint();
    t=getint();     
    for(int re i=1;i<=m;++i){
        int u=getint(),v=getint();
        ll w=getint();
        addedge(u,v,w);
    }
    outint(maxflow());
    putchar('\n');
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/zxyoi_dreamer/article/details/81874107