问题: 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. Linux编程遇到的问题汇集(持续更新中)

    1.源代码编译redis报告错误: undefined reference to `__sync_add_and_fetch_4' 最近项目组在实验Redis,源代码编译的时候,遇到了错误:undef ...

  2. Mediawiki.org的PHP编码约定

    http://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP assignment作为expression来用看起来像个错误(looks su ...

  3. C语言初学 简单定义圆的面积计算问题

    #include<stdio.h> #define PI 3.14159 main() { double a; scanf("%lf",&a); printf( ...

  4. android studio gradle自动签名构建实现

    我为自己代言: 一.在android studio中生成签名文件. 1.在android studio 选中项目,在菜单栏中选择Build. 2.点击Generate Signed APK选项卡. 3 ...

  5. Eclipse项目导入Android Stuio 配置出现 Timeout waiting to lock buildscript class cache for build file 'H:\studioproject\Generic_SN\build.gradle'

     Eclipse项目导入Android Stuio 配置出现 Error:Timeout waiting to lock buildscript class cache for build file  ...

  6. gcd - b- 201611302317

    谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如 ...

  7. 宏汇编软件MASM51的使用

    单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...

  8. BZOJ1089: [SCOI2003]严格n元树

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 762  Solved: 387[Submit][Status ...

  9. AzCopy – 跨帐户复制 Blob

    您可以随时从 aka.ms/AzCopy 下载最新版本. 去年4月发布的版本中的新增功能 支持跨帐户复制 Blob:AzCopy 允许您在相同存储帐户内或不同存储帐户之间复制 Blob(有关跨帐户 B ...

  10. SQL SERVER 系统存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...