这道题算是网络流最基础的一道题了吧,我是直接用的EK算法做的,直接套用模板就好了。
有一定值得注意的就是,如果数据有重边的话,边的容量是读入的这条边的容量之和。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m; //n个顶点,m条边
int c[205][205]; //c[i][j]=k表示从i到j有容量为k的边
int pre[105]; //记录增广路径
bool bfs(int s,int t) //寻找增广路径
{
queue<int> q;
bool v[205];
memset(v,0,sizeof(v));
q.push(s);
v[s]=1; pre[s]=s;
while (!q.empty())
{
int w=q.front();
q.pop();
for (int i=1;i<=n;i++)
{
if ((c[w][i])&&(!v[i]))
{
pre[i]=w;
v[i]=1;
if (i==t) return 1; //找到增广路径
q.push(i);
}
}
}
return 0;
}
int main()
{
while (scanf("%d%d",&m,&n)!=EOF)
{
int ans=0;
memset(c,0,sizeof(c));
for (int i=0;i<m;i++)
{
int j,k,l;
scanf("%d%d%d",&j,&k,&l);
c[j][k]+=l; //有重边的话就把容量增加
}
while (bfs(1,n))
{
int d=c[pre[n]][n];
for (int i=n;i!=1;i=pre[i])
{
d=min(d,c[pre[i]][i]); //找到可以增加的流
}
for (int i=n;i!=1;i=pre[i])
{
c[pre[i]][i]-=d;
c[i][pre[i]]+=d; //建立反向边
}
ans+=d;
}
printf("%d\n",ans);
}
return 0;
}