UVA 820 --- POJ 1273 最大流

找了好久这两个的区别。。。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

 

posted @ 2015-09-04 18:02  一麻袋码的玛侬  阅读(228)  评论(0编辑  收藏  举报