MemoryGarden's Blog

努力 -----------大能猫

C++博客 首页 新随笔 联系 聚合 管理
  118 Posts :: 11 Stories :: 20 Comments :: 0 Trackbacks
链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1459

题意 :有一个电力网络,有发电厂,有变压器,又用户,图的意思是容量,以及流量,还有边,以及边的容量,流量。求解用户的最大使用量。

输入 :2个测试数据
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20   

 //总共两个点  一个发电厂,一个用户,2条边,(0, 1)点容量为20,(1, 0)点容量为10,编号为0的点是发电厂,即源,编号为1的点是用户,即汇


7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7  
(3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5
(0)5 (1)2 (3)2 (4)1 (5)4

//意思同上


想法 :
这个题就是一个单纯的不能再单纯的网络流了,锻炼了一下英语能力。设一个源s和一个汇t,我设的是第m个点位源,第m + 1个点位汇。最后把源s和发电厂连接,边的容量为发电厂的容量,将用户与汇t连接,容量为用户的容量

然后fm最大流 :不断找源s和汇t的路径,选取瓶颈容两,更新剩余图,直至不能更新。剩余容量和为结果。时间复杂度比较高。望高手指点更好的算法。


代码如下 :

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #define max 500
 5 using namespace std;
 6 int n, np, nc, m, r[max][max], ok, judge[max], p[max], res;
 7 queue<int> qu, qq;
 8 void gao(){
 9     int i, j, s, t;
10     qu.push(n);
11     judge[n] = 1;
12     while(1){
13         s = qu.size();
14         if(!s){ok = 0;return;}
15         while(s--){
16             t = qu.front();
17             qu.pop();
18             if(t == n + 1){ok = 1;return;}
19             for(i = 0; i <= n + 1; i++){
20                 if(r[t][i] > 0 && !judge[i]){
21                     qu.push(i);
22                     judge[i] = 1;
23                     p[i] = t;
24                 }
25             }
26         }
27     }
28 }
29 void update(){
30     int i, j, u, v, min = 999999999;
31     u = p[n + 1];
32     v = n + 1;
33     while(u >= 0){
34         if(r[u][v] < min)min = r[u][v];
35         v = u;
36         u = p[u];
37     }
38     u = p[n + 1];
39     v = n + 1;
40     while(u >= 0){
41         r[u][v] -= min;
42         r[v][u] += min;
43         v = u;
44         u = p[u];
45     }
46     res += min;
47 }
48 int main(){
49     freopen("1459.in","r",stdin);
50     freopen("1459.out","w",stdout);
51     int i, j, u, v, w;char c;
52     while(scanf("%d%d%d%d"&n, &np, &nc, &m) != -1){
53         ok = 1;res = 0;
54         memset(r, 0sizeof(r));
55         for(i = 0; i < m; i++){
56             while(getchar()!='(');
57             scanf("%d,%d)%d"&u, &v, &w);
58             r[u][v] = w;
59         }
60         for(i = 0; i < np; i++){
61             while(getchar()!='(');
62             scanf("%d)%d"&u, &w);
63             r[n][u] = w;
64         }
65         for(i = 0; i < nc; i++){
66             while(getchar()!='(');
67             scanf("%d)%d"&u, &w);
68             r[u][n + 1= w;
69         }
70         while(ok){
71             ok = 0;qu = qq;
72             memset(p, -1sizeof(p));
73             memset(judge, 0sizeof(judge));
74             gao();
75             if(ok)
76                 update();
77         }
78         printf("%d\n", res);
79     }
80     return 0;
81 }
82 
83 


ps : 输入搞了我几次re,比较有意思。

posted on 2008-09-05 03:55 memorygarden 阅读(1284) 评论(1)  编辑 收藏 引用 所属分类: 报告

Feedback

# re: poj 1459 Power Network 2009-04-20 20:01 hglem
up up, 拿去做模板了  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理