找了好久这两个的区别。。。UVA820 WA了 好多次。不过以后就做模板了,可以求任意两点之间的最大流。
UVA 是无向图,因此可能有重边,POJ 1273是有向图,而且是单源点求最大流,因此改模板的时候注意一下。
而且我居然犯了更愚蠢的错误,以为重边的时候需要选最大的,正解应该是累加。。。。
#include<stdio.h>
#include<queue>
#include<string.h>
#define INF 999999
using namespace std;
int s,t,n,m;
int map[][],flow[][];
int p[],a[];
int EK(int s,int t)
{
queue<int>q;
int sum=;
memset(flow,,sizeof(flow));
while()
{
memset(a,,sizeof(a));
a[s]=INF;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=; i<=m; i++)
{
if(!a[i]&&flow[u][i]<map[u][i])
{
p[i]=u;
q.push(i);
a[i]=a[u]<map[u][i]-flow[u][i]?a[u]:map[u][i]-flow[u][i];
}
}
}
if(!a[t])break;
for(int i=t; i!=s; i=p[i])
{
flow[p[i]][i]+=a[t];
flow[i][p[i]]-=a[t];
}
sum+=a[t];
}
return sum;
}
int main()
{
int cas=;
while(scanf("%d",&m),m)
{
scanf("%d%d%d",&s,&t,&n);
memset(map,,sizeof(map));
int a,b,c;
for(int i=; i<n; i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]+=c;
map[b][a]=map[a][b];
}
int maxx=EK(s,t);
printf("Network %d\n",cas++);
printf("The bandwidth is %d.\n\n",maxx);
}
return ;
}
UVA 820 直接EK模板上
可与POJ 1273 的有向图比较一下
注释掉了一个加边
POJ 1273 样例来一发
2 2
1 2 3
1 2 5 答案是8
2 2
1 2 3
2 1 5 答案是3