裸的网络流,注意有重边就行。比如 dicuss上的一组数据,结果应为15:
3 2
1 2 41 2 5
1 2 6
#include<stdio.h>
#include<string.h>
#define MX 10000000
int n,m,c[205][205],f[205][205],pre[205],mf[205],q[205];
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
for(int i=0;i<m;i++)
{
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
c[a][b]+=k;
}
while(1)
{
for(int i=1;i<=n;i++)
pre[i]=-2;
pre[1]=-1;
int qe=1,qs=0;
q[qs]=1;
mf[1]=MX;
while(pre[n]==-2&&qs<qe)
{
int v=q[qs];
qs++;
for(int i=1;i<=n;i++)
{
int p=c[v][i]-f[v][i];
if(pre[i]==-2&&p>0)
{
mf[i]=mf[v]<p?mf[v]:p;
pre[i]=v;
q[qe]=i;
qe++;
}
}
}
if(pre[n]==-2)break;
for(int i=pre[n],j=n;i!=-1;j=i,i=pre[i])
{
f[i][j]+=mf[n];
f[j][i]-=mf[n];
}
}
int sum=0;
for(int i=1;i<n;i++)
sum+=f[i][n];
printf("%d\n",sum);
}
return 0;
}