源点到汇点的问题:
理解: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; }