网络流最大流

/*网络流最大流模板
输入:
点数n,边数m,起点s,终点t
m条边:起点,终点,最大流量
输出:
最大流*/
int ans;
int n,m,s,t;
struct Edge{
    int to,next,value;
}e[maxn];int head[maxn],cntedge=1;
inline void addedge(int fr,int to,int value){
    e[++cntedge]={to,head[fr],value};
    head[fr]=cntedge;
}
int dis[maxn];
int bfs(){
    for(int i=1;i<=n;i++)dis[i]=-1;
    queue<int>q;
    dis[s]=0;q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(dis[v]==-1&&e[i].value>0){
                dis[v]=dis[u]+1;
                q.push(v);
            }
        }
    }
    return dis[t]!=-1;
}
int dfs(int u,int exp){
    if(u==t)return exp;
    int flow=0,tmp=0;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(dis[v]==dis[u]+1&&e[i].value>0){
            tmp=dfs(v,min(exp,e[i].value));
            if(!tmp){dis[v]=0;continue;}
            exp-=tmp;
            flow+=tmp;
            e[i].value -=tmp;
            e[i^1].value +=tmp;
            if(!exp)break;
        }
    }
    return flow;
}
signed main(){
    in(n);in(m);in(s);in(t);
    for(int i=1,x,y,z;i<=m;++i){
        in(x);in(y);in(z);
        addedge(x,y,z);
        addedge(y,x,-z);
    }
    while(bfs()){
        ans+=dfs(s,inf);
    }
    o(ans);putchar('
');
}
原文地址:https://www.cnblogs.com/yesuweiYYYY/p/13992545.html