标准的是Edmonds-Karp 最短增广路算法 +网络流讲解
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
const int INF=0x3f3f3f3f;
int pre[300];//先前节点
int book[300];//每次寻找标记
int e[300][300];//存放地图
int n,m;
int getland()
{
memset(pre,0 ,sizeof pre);
memset(book,0,sizeof book);
pre[1]=0;
book[1]=1;
deque<int>q;//也可以使用queue,但deque可以清空队列
q.push_back(1);
bool flag=0;
while(q.size())
{
int v=q.front();q.pop_front();
rep(i,1,m)
{
if(e[v][i]>0&&!book[i])
{
pre[i]=v;book[i]=1;
if(i==m) {flag=1;q.clear(); break;}
q.push_back(i);
}
}
}
if(!flag) return 0;//没有能够到达t的路径
int K=INF;
int v=m;
int p;
while(pre[v]) p=pre[v] ,K=min(K,e[p][v]),v=pre[v];//找到当前路径的最小值
v=m;
while(pre[v]) p=pre[v],e[p][v]-=K,e[v][p]+=K,v=pre[v];//建立反向路径
return K;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
while(cin>>n>>m)
{
memset(e,0,sizeof e);
rep(i,1,n)
{
int x,y,z;cin>>x>>y;
cin>>z;e[x][y]+=z;//一个点可能连接多个点
}
ll ans=0;
ll t;
while(t=getland())
ans+=t;
cout<<ans<<endl;
}
}