问题: 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. Javascript计算密码的强度

    用Javascript评估用户输入密码的强度 1.如果密码少于5位,那么就认为这是一个弱密码.2.如果密码只由数字.小写字母.大写字母或其它特殊符号当中的一种组成,则认为这是一个弱密码.3.如果密码由 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Bash的几个知识点

    1. 区别 builtin command, external command,bash script. 用builtin command(hash.type.command),而不是which命令( ...

  4. hdu Joseph

    #include <cstdio> #include <iostream> #include <algorithm> using namespace std; ]; ...

  5. leetcode_Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  6. BZOJ1653: [Usaco2006 Feb]Backward Digit Sums

    1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 207  Solved:  ...

  7. Html5/Css3 向下兼容placeholder

    Css3下input标签的placeholder属性在IE10以下是不兼容的,页面加入这段JS脚本后,能够兼容IE6+ //@charset "utf-8"; /** * jque ...

  8. Android自定义ListView的Item无法响应OnItemClick的解决办法

     转: 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也 ...

  9. 在 Ubuntu 12.04 上安装 GitLab6.0

    安装环境: 操作系统:    Ubuntu 12.4 LTS 英文 数据库:        mysql5.5.32 web服务器: nginx1.4.1 首先, 添加git和nginx的ppa,并升级 ...

  10. <PHP>字符串处理代码

    字符串处理:        strlen("aaa");取字符串的长度 ***    strcmp("aaa","aaa");比较两个字符串 ...