POJ 1459 最大流 第二题
2016-01-06 15:34
381 查看
http://poj.org/problem?id=1459
也是网络流的基础,只是虚拟出一个源点和终点,对应的生产值和消费值就加到与源点和终点的边上,然后做一次bfs就好了。
View Code
也是网络流的基础,只是虚拟出一个源点和终点,对应的生产值和消费值就加到与源点和终点的边上,然后做一次bfs就好了。
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <algorithm> 5 #define INF 999999999 6 //#define OPEN_FILE 7 using namespace std; 8 9 const int MAXN = 105; 10 int cap[MAXN][MAXN], flow[MAXN][MAXN], p[MAXN], c[MAXN], f[MAXN]; 11 int n, ans; 12 13 void get_cap(char s[]) 14 { 15 int i, u, v, w; 16 u = 0; 17 for (i = 1; s[i] != ','; i++){ 18 u = u * 10 + (s[i] - '0'); 19 } 20 v = 0; 21 for (++i; s[i] != ')'; i++){ 22 v = v * 10 + (s[i] - '0'); 23 } 24 int len = strlen(s); 25 w = 0; 26 for (++i; i < len; i++){ 27 w = w * 10 + (s[i] - '0'); 28 } 29 cap[u][v] = w; 30 } 31 32 void get_pc(char s[], int* t, int o) 33 { 34 int i, u, w; 35 u = 0; 36 for (i = 1; s[i] != ')'; i++){ 37 u = u * 10 + (s[i] - '0'); 38 } 39 int len = strlen(s); 40 w = 0; 41 for (++i; i < len; i++){ 42 w = w * 10 + (s[i] - '0'); 43 } 44 if (o){ 45 cap [u] = w; 46 } 47 else{ 48 cap[u][n + 1] = w; 49 } 50 51 } 52 53 void ek_bfs(){ 54 queue<int> d; 55 int s, t, u, v; 56 int a[MAXN]; 57 s = n; 58 t = n + 1; 59 ans = 0; 60 while (1){ 61 memset(a, 0, sizeof(a)); 62 a[s] = INF; 63 d.push(s); 64 while (!d.empty()){ 65 u = d.front(); 66 d.pop(); 67 for (v = 0; v <= n + 1; v++){ 68 if (a[v] || cap[u][v] <= flow[u][v]) continue; 69 f[v] = u; 70 d.push(v); 71 a[v] = min(a[u] , cap[u][v] - flow[u][v]); 72 } 73 } 74 if (a[t] == 0) break; 75 for (u = t; u != s; u = f[u]){ 76 flow[f[u]][u] += a[t]; 77 flow[u][f[u]] -= a[t]; 78 } 79 ans += a[t]; 80 } 81 } 82 83 int main() 84 { 85 #ifdef OPEN_FILE 86 freopen("in.txt", "r", stdin); 87 freopen("out.txt", "w", stdout); 88 #endif // OPEN_FILE 89 int m, np, nc, i, j; 90 char s[101]; 91 while (~scanf("%d%d%d%d", &n, &np, &nc, &m)){ 92 memset(cap, 0, sizeof(cap)); 93 memset(flow, 0, sizeof(flow)); 94 memset(p, 0, sizeof(p)); 95 memset(c, 0, sizeof(c)); 96 for (i = 1; i <= m; i++){ 97 scanf("%s", s); 98 get_cap(s); 99 } 100 for (i = 1; i <= np; i++){ 101 scanf("%s", s); 102 get_pc(s, p, 1); 103 } 104 for (i = 1; i <= nc; i++){ 105 scanf("%s", s); 106 get_pc(s, c, 0); 107 } 108 ek_bfs(); 109 printf("%d\n", ans); 110 } 111 }
View Code
相关文章推荐
- POJ 1293 网络流 第一题
- ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
- 水 hdu5208 2015-04-20 21:03 36人阅读 评论(0) 收藏
- JAVA学习【2】错误:无法从静态上下文中引用非静态
- js条件语句false情况
- 给函数和变量取个合适的名字
- 腾讯云无法用域名访问IIS上的网站
- jquery商城类封装插件
- 初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
- 初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
- 在myeclipse中 移动多行代码
- 如何扩展jquery插件
- 博客基本形式 时间和文字
- C/C++结构体字节对齐详解
- 为什么会有article和aside不同的标签
- js实现复制到剪切板,兼容所有浏览器
- Code ReView
- NavigationBar底部有条横线怎么办
- 二分查找
- 将现有Ubuntu系统做成LiveCD