问题: 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. MySQL STRAIGHT_JOIN

    问题 最近在调试一条查询耗时5s多的sql语句,这条sql语句用到了多表关联(inner join),按时间字段排序(order by),时间字段上已经创建了索引(索引名IDX_published_a ...

  2. dedecms 织梦ping服务插件 最新破解可用版

    dedecms 织梦ping服务插件 最新破解可用版  ping_gbk.xml <module> <baseinfo> name=ping服务 team=井哥 time=20 ...

  3. (翻译玩)SQLALchemy backref章节文档

    Linking Relationships with Backref 自从在Object Relational Tutorial中第一次提到backref参数后,许多案例中也用到了backref,那么 ...

  4. kettle 连接 mysql 出错 Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the ……

    解决办法:1: 首先,到官网下载mysql-connector-java. 2: 把驱动文件放置在data-integration\lib\ 目录下

  5. CCI_chapter 1

    1.1Implement an algorithm to determine if a string has all unique characters What if  you can not us ...

  6. bat命令大全

    一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置.   语法 echo [{on│off}] [message ...

  7. Chaos Software Google Sync v10.1.1.0 和Syncovery Pro

    Chaos Software Google Sync v10.1.1.0 Release: Chaos.Software.Google.Sync.v10.1.1.0.Incl.Keygen-BEANS ...

  8. 外部函数接口 LibFFI

    “FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码.而 “Libffi” 库只提供了最底层的.与架构相关的.完整的”FF ...

  9. PowerShell正则表达式(一) 定义模式

    PowerShell正则表达式(一) 定义模式 7 29 9月, 2013  在 Powershell tagged 正则表达式 by Mooser Lee 本文索引 [隐藏] 1限定符 2识别IP地 ...

  10. VS2015 C#6.0 中的那些新特性(转载)

    自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...