问题: 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. C语言基础学习基本数据类型-其他整数类型

    其他整数类型 初学C语言时,int类型会满足你对整数的大多数需求. C语言还提供了三个关键字用以修饰基本的整数类型:short.long和unsigned.有以下几个注意点: (1)C语言没有具体规定 ...

  2. 关于KMP算法理解(快速字符串匹配)

    参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 2016-08- ...

  3. windows下adb+flash_image刷机

    刷机是常事,总要把刷机包放在卡上,然后关机三键一起按到recovery再刷,觉得不爽,麻烦,所以研究出了adb调用flash_image刷system分区,全部脚本windows脚本执行,点点鼠标就o ...

  4. Unicode字符集下CString与char *相互转换

    经常遇到CString转换char*时只返回第一个字符.原因是因为在Unicode字符集下CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符.所以直接转换在基于MBCS的 ...

  5. 继网易博客后搜狐博客也增加了nofollow标签

    继网易博客后搜狐博客也增加了nofollow标签 今天在搜狐博客发表了篇文章,在末端添加上我的版权,结果回头查看是发现,这个锚文本被加上了nofollow标签,也就是说这样的外链已经没有传递权重的作用 ...

  6. cf Strings of Power

    http://codeforces.com/contest/318/problem/B #include <cstdio> #include <cstring> #includ ...

  7. Spring注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用.其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spri ...

  8. smarty 从配置文件读取变量

    smarty变量分3种: Variables [变量] Variables assigned from PHP [从PHP分配的变量] Variables loaded from config fil ...

  9. spin.js无图片实现loading进度条,支持但非依赖jquery

    特点: 1.无图片,无外部CSS 2.无依赖(支持jQuery,但非必须) 3.高度可配置 4.分辨率无关 5.旧版本IE不支持时,采用VML支持 6.使用关键帧动画,采用setTimeout() 7 ...

  10. 如何应对“改变现状”的失败"

    参加工作后,利用闲暇时间看了一些书,发现以上的场景可以通过心理学,神经生物学等相关的知识来解析,同时也可以利用这些知识来进行一些改进.那么下文就来尝试通过心理学来解析这个场景,同时提出一些改进方法. ...