找了好久这两个的区别。。。UVA820 WA了 好多次。不过以后就做模板了,可以求任意两点之间的最大流。
UVA 是无向图,因此可能有重边,POJ 1273是有向图,而且是单源点求最大流,因此改模板的时候注意一下。
而且我居然犯了更愚蠢的错误,以为重边的时候需要选最大的,正解应该是累加。。。。
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 #define INF 999999 5 using namespace std; 6 int s,t,n,m; 7 int map[407][407],flow[407][407]; 8 int p[407],a[407]; 9 int EK(int s,int t) 10 { 11 queue<int>q; 12 int sum=0; 13 memset(flow,0,sizeof(flow)); 14 while(1) 15 { 16 memset(a,0,sizeof(a)); 17 a[s]=INF; 18 q.push(s); 19 while(!q.empty()) 20 { 21 int u=q.front(); 22 q.pop(); 23 for(int i=1; i<=m; i++) 24 { 25 if(!a[i]&&flow[u][i]<map[u][i]) 26 { 27 p[i]=u; 28 q.push(i); 29 a[i]=a[u]<map[u][i]-flow[u][i]?a[u]:map[u][i]-flow[u][i]; 30 } 31 } 32 } 33 if(!a[t])break; 34 for(int i=t; i!=s; i=p[i]) 35 { 36 flow[p[i]][i]+=a[t]; 37 flow[i][p[i]]-=a[t]; 38 } 39 sum+=a[t]; 40 } 41 return sum; 42 } 43 int main() 44 { 45 int cas=1; 46 while(scanf("%d",&m),m) 47 { 48 scanf("%d%d%d",&s,&t,&n); 49 memset(map,0,sizeof(map)); 50 int a,b,c; 51 for(int i=0; i<n; i++) 52 { 53 scanf("%d%d%d",&a,&b,&c); 54 map[a][b]+=c; 55 map[b][a]=map[a][b]; 56 } 57 int maxx=EK(s,t); 58 printf("Network %d\n",cas++); 59 printf("The bandwidth is %d.\n\n",maxx); 60 } 61 return 0; 62 }
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
时间: 2024-11-08 11:51:54