这道题着实让我蛋疼了一下,看完书上的代码之后信心满满还稍微修改了一下方法来做这道题,结果wa的暗无天日,后来猛然想到oj的测试数据不一定一半是零,然后感觉样例输入果然很坑人,然后AC:
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int cap[32][32];
int flow[32][32];
int a[32];
int p[32];
int main()
{
int n;
while(scanf("%d",&n),n)
{
memset(flow,0,sizeof(flow));
memset(cap,0,sizeof(cap));
int i,j;
int f=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int m;
scanf("%d",&m);
cap[i][j]+=m;
cap[j][i]+=m;
flow[j][i]+=m;
}
if(n==1)
printf("Maximum number of goods: 0.\n");
int flag=0;
while(1)
{
memset(a,0,sizeof(a));
a[1]=2147483647;
queue<int> q;
q.push(1);
while(!q.empty())
{
int k=q.front();
q.pop();
for(i=1;i<=n;i++)
if(a[i]==0&&cap[k][i]>flow[k][i])
{
p[i]=k;
q.push(i);
a[i]=((a[k]<(cap[k][i]-flow[k][i]))?a[k]:(cap[k][i]-flow[k][i]));
}
}
if(a[n]==0)
break;
for(i=n;i!=1;i=p[i])
{
flow[p[i]][i]+=a[n];
flow[i][p[i]]-=a[n];
}
f+=a[n];
}
printf("Maximum number of goods: %d.\n",f);
}
}