网络流问题

源点到汇点的问题:
理解:https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html

代码(蓝桥杯):https://blog.csdn.net/Tiooo111/article/details/105268608/

#include <bits/stdc++.h>
using namespace std;

int N,M;
int s,t;
int res;

map<int,map<int,int> >  mp;
vector<int> a;
vector<int> pre;

void Solution(){
     queue<int> que;
    while(1){//从源点开始找

        a.assign(N+1,0);  //初始化 a
        a[s]=INT_MAX;     //源点相当于有无限的流量
        que.push(s);      //每次都是从源点开始找
        
        while(!que.empty()){  //bfs找增广路
            int v=que.front();
            que.pop();
            for(map<int,int>::iterator i=mp[v].begin();i!=mp[v].end();++i){
                if(!a[i->first]&&i->second>0){
                    pre[i->first]=v;
                    a[i->first]=min(a[v],i->second);
                    que.push(i->first);
                }
            }
        }
        
        if(a[t]==0)return;//没有剩余的流量了
        
        res+=a[t];
        for(int i=N;i!=1;i=pre[i]){//更新走过的路的流量
            mp[pre[i]][i]-=a[t];
            mp[i][pre[i]]+=a[t];
        }
    }
}
int main(){
    cin>>N>>M;
    for(int i=0;i<M;++i){
        int k,j,l;
        cin>>k>>j>>l;
        mp[k][j]+=l;//是+= 不是= 一条边可能会重复出现
    }
    s=1;//源点
    t=N;//汇点
    pre.assign(N+1,0);
    Solution();
    cout<<res<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/cxwpluto/p/13157696.html