问题: POJ1459

  涉及内容:最大网络流

分析:

  本题问题看似非常复杂,实际上可以转化为单源点单汇点的最大网络流问题。

  1)因为电量只在发电站产生,故增加源点S,构建从S到每个发电站的有向边,边的权值即各个发电站的发电量。则可把S看成唯一发电站,其余发电站只是一个中转站。

  2)因为电量只在消费站消耗,故增加汇点T,构建从每个消费者到T的有向边,边的权值即各个消费者的耗电量。则可以把T看成唯一的消费站,其余消费者也作为中转站。

  这样,问题就转化为从源点S到汇点T的最大网络流问题。可采用增广路径算法解决,耗时391ms。若采用的压入与重标记算法,或者重标记与前移算法,应该能达到更高的效率。

注:输入字符串处理的过程中,由于忽视了(u,v)z中的u,v,z可能大于一位的情况,导致wa了很久。

AC代码:

 //Memory: 292K        Time: 391MS
 #include <iostream>
 #include <cstring>

 using namespace std;

 ;
 int c[maxn][maxn];
 int cf[maxn][maxn];
 int p[maxn], cc[maxn];
 int n, np, nc, m;
 int u, v, l;
 int edge[maxn][maxn];
 int ne[maxn];
 int prior[maxn];
 ];
 ;
 int q[maxn];
 int front, rear;
 bool vis[maxn];
 int consume;

 bool bfs( int s )
 {
     ; i <= n; i++)
         prior[i] = -;
     front = rear = ;
     q[rear++] = s;
     while (front != rear) {
         int current = q[front++];
          ) {
             prior[n] = current;
             return true;;
         }
         ; i < ne[current]; i++) {
              && edge[current][i] != current && prior[ edge[current][i] ] == - ) {
                 prior[ edge[current][i] ] = current;
                 q[rear++] = edge[current][i];
             }
         }
     }
     return false;
 }

 void update()
 {
     int current;
     int pr = n;
     ;
     while ( pr != s ) {
         current = pr;
         pr = prior[current];
         if ( cf[pr][current] < _min)
             _min = cf[pr][current];
     }
     current;
     pr = n;
     while (pr != s) {
         current = pr;
         pr = prior[current];
         cf[pr][current] -= _min;
         cf[current][pr] += _min;
     }
     consume += _min;
 }

 void input()
 {
     memset(c, , sizeof(c));
     memset(edge, , sizeof(edge));
     memset(ne, , sizeof(ne));
         ; i < m; i++){
             scanf("%s", in);
             int ix;
             u = ;
             ; in[ix] != ','; ix++)
                 u = u *  + ';
             v = ;
             for (ix++; in[ix] != ')'; ix++)
                 v = v *  + ';
             l = ;
             int len = strlen(in);
             for (ix++; ix < len; ix++) {
                 l = l *  + ';
             }
             c[u][v] = l;
             edge[u][ne[u]++] = v;
         }
         ; i < np; i++) {
             scanf("%s", in);
             int ix;
             u = ;
             ; in[ix] != ')'; ix++)
                 u = u *  + ';
             l = ;
             int len = strlen(in);
             for (ix++; ix < len; ix++) {
                 l = l *  + ';
             }
             c[s][u] = l;
             edge[s][ne[s]++] = u;
         }
         ; i < nc; i++) {
             scanf("%s", in);
             int ix;
             u = ;
             ; in[ix] != ')'; ix++)
                 u = u *  + ';
             l = ;
             int len = strlen(in);
             for (ix++; ix < len; ix++) {
                 l = l *  + ';
             }
             c[u][n] = l;
             edge[u][ne[u]++] = n;
         }
 }
 int main()
 {
     while ( scanf("%d%d%d%d", &n, &np, &nc, &m) != EOF ){
         input();
         memcpy(cf, c, sizeof(c));
         consume = ;
         while ( bfs(s) ) {
             update();
         }
         printf("%d\n", consume);
     }
     ;
 }

POJ1459 最大网络流的更多相关文章

  1. poj-1459(网络流-最大流)

    题意:给你n个点的电网系统,有一些点是电站,能提供p的电能,有些点是用户,能消耗c的电能,有些是过渡站,不消耗不产生(等于没用),然后m条电线(x,y,w),代表x可以向y运输w的电能,问你这个电网系 ...

  2. POJ1459 Power Network 网络流 最大流

    原文链接http://www.cnblogs.com/zhouzhendong/p/8326021.html 题目传送门 - POJ1459 题意概括 多组数据. 对于每一组数据,首先一个数n,表示有 ...

  3. poj1459网络流之多源点最大流

    这题想了好久,一直认为应该bfs更新后求最小值把发电站最大发电加进去,但是又发现这样求增广路的时候会导致用户更新出错, 加源点和汇点也考虑到了,没想到居然发电量就是超级源到源点的v,居然这么简单@.@ ...

  4. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

  5. POJ-1459 Power Network---最大流

    题目链接: https://cn.vjudge.net/problem/POJ-1459 题目大意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有 ...

  6. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  7. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  8. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  9. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

随机推荐

  1. stack适配栈

    #include <stack> stack<int> s; s.empty() 如果栈为空,则返回 true,否则返回 stack s.size() 返回栈中元素的个数 s. ...

  2. iOS 拨打电话三种方式总结

    1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString * str=[[NSMutableString alloc] initWithFo ...

  3. VMware Network Adapter VMnet1和VMnet8 未识别的网络的解决方法

    VMware Network Adapter VMnet1和VMnet8 被防火墙认定为未识别的网络,阻隔,无法使用端口映射,虚拟机的80端口无法传入,数据包只能出不能入.且公用网络被限制不能修改为家 ...

  4. BZOJ2768: [JLOI2010]冠军调查

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 332[Submit][Status ...

  5. iOS 9之SFSafariViewController

    金田( github 示例源码) 有时候需要在App内部打开一个网页,例如为了展示公司官网,产品列表信息,Facebook,微博等.以前都是使用 UIWebView,iOS 8引入了WKWebView ...

  6. JVM基础和调优(五)

    垃圾回收算法中收集器 接着上面的说,了解了JVM收集垃圾的过程,然后我们看一看收集器. 串行收集器:用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所 ...

  7. HDU5584 LCM Walk 数论

    LCM Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  8. Maven--生命周期和插件(四)

    <Maven--搭建开发环境(一)> <Maven--构建企业级仓库(二)> <Maven—几个需要补充的问题(三)> <Maven—生命周期和插件(四)&g ...

  9. c语言结构体数组定义的三种方式

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...

  10. CSS3实现三角形

    很多时候我们用到三角形这个效果: 我们可以用CSS3实现这个效果,怎去做呢?先阐述一下原理,我们定义一个空的div,设置这个div宽高为0,给这个div加上一个100px边框(这里是方便观察),得到的 ...