题目链接:

https://cn.vjudge.net/problem/POJ-1459

题目大意:

简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最多运载限定。
前4个数据就是有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条线路的数据,(起点,终点)最多运载量,然后是np个供电点的数据(供电点)最多供电量,接着就是nc个消费点的数据(消费点)最多消费电量。
题目要我们求出给定的图最大能消费的总电量(就是求最大流)

解题思路:

传送门:网络流

供电点有提供功能,那么供电点就可以当成源点,同样消费点有消费功能,可以当成汇点。
由于这题有多个供电点和消费点,我们可以增加两个点,一个超级源点和一个超级汇点。
把所有的供电点都当成是由超级源点提供电量的,所有的消费点都将消费电量转移到超级汇点上,这样就相当于转换成一个基本的网络流求最大流的题。
超级源点与供电点有一条边,边的值为供电点最大能提供的电量,消费点与超级汇点有一条边,边的值为消费点最大能消费的电量。

增加源点汇点这一技巧很常用。

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<queue>
  6. using namespace std;
  7. const int INF = 0x3f3f3f3f;
  8. const int maxn = + ;
  9. struct edge
  10. {
  11. int u, v, c, f;
  12. edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
  13. };
  14. vector<edge>e;
  15. vector<int>G[maxn];
  16. int a[maxn];//找增广路每个点的水流量
  17. int p[maxn];//每次找增广路反向记录路径
  18. void init(int n)
  19. {
  20. for(int i = ; i <= n; i++)G[i].clear();
  21. e.clear();
  22. }
  23. void addedge(int u, int v, int c)
  24. {
  25. e.push_back(edge(u, v, c, ));
  26. e.push_back(edge(v, u, , ));
  27. int m = e.size();
  28. G[u].push_back(m - );
  29. G[v].push_back(m - );
  30. }
  31. int Maxflow(int s, int t)
  32. {
  33. int flow = ;
  34. for(;;)//每次寻找增广路
  35. {
  36. memset(a, , sizeof(a));//初始化每个节点的流量均为0,源点流量为INF
  37. a[s] = INF;
  38. queue<int>q;
  39. q.push(s);
  40. while(!q.empty())
  41. {
  42. int u = q.front();
  43. q.pop();
  44. for(int i = ; i < G[u].size(); i++)
  45. {
  46. edge &now = e[G[u][i]];
  47. int v = now.v;
  48. if(!a[v] && now.c > now.f)//v点还未流经,且这条路还没流满
  49. {
  50. p[v] = G[u][i];//反向记录
  51. a[v] = min(a[u], now.c - now.f);
  52. q.push(v);
  53. }
  54. }
  55. if(a[t])break;//已经到汇点
  56. }
  57. if(!a[t])break;//已经找不到增广路
  58. for(int u = t; u != s; u = e[p[u]].u)
  59. {
  60. e[p[u]].f += a[t];
  61. e[p[u] ^ ].f -= a[t];
  62. }
  63. flow += a[t];
  64. }
  65. return flow;
  66. }
  67. int main()
  68. {
  69. int n, np, nc, m;//分别表示点数,电站数,居民数,边数
  70. while(cin >> n >> np >> nc >> m)
  71. {
  72. int s = n, t = n + ;
  73. init(t);
  74. int u, v, c;
  75. for(int i = ; i < m; i++)//建边
  76. {
  77. while(getchar() != '(');//读取左括号
  78. scanf("%d,%d)%d", &u, &v, &c);
  79. addedge(u, v, c);
  80. }
  81. for(int i = ; i < np; i++)//对于每个电站,从源点到电站点连一条边,权值为电站发电值
  82. {
  83. while(getchar() != '(');
  84. scanf("%d)%d", &v, &c);
  85. addedge(s, v, c);
  86. }
  87. for(int i = ; i < nc; i++)//对于每个居民,从居民点到汇点连一条边,权值是居民用电值
  88. {
  89. while(getchar() != '(');
  90. scanf("%d)%d", &u, &c);
  91. addedge(u, t, c);
  92. }
  93. cout<<Maxflow(s, t)<<endl;
  94. }
  95. return ;
  96. }

POJ-1459 Power Network---最大流的更多相关文章

  1. POJ 1459 Power Network 最大流(Edmonds_Karp算法)

    题目链接: http://poj.org/problem?id=1459 因为发电站有多个,所以需要一个超级源点,消费者有多个,需要一个超级汇点,这样超级源点到发电站的权值就是发电站的容量,也就是题目 ...

  2. 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 ...

  3. poj 1459 Power Network

    题目连接 http://poj.org/problem?id=1459 Power Network Description A power network consists of nodes (pow ...

  4. 2018.07.06 POJ 1459 Power Network(多源多汇最大流)

    Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...

  5. POJ 1459 Power Network(网络流 最大流 多起点,多汇点)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 22987   Accepted: 12039 D ...

  6. 网络流--最大流--POJ 1459 Power Network

    #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #incl ...

  7. poj 1459 Power Network : 最大网络流 dinic算法实现

    点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted:  ...

  8. poj 1459 Power Network【建立超级源点,超级汇点】

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25514   Accepted: 13287 D ...

  9. POJ 1459 Power Network(网络最大流,dinic算法模板题)

    题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数.      接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...

  10. POJ - 1459 Power Network(最大流)(模板)

    1.看了好久,囧. n个节点,np个源点,nc个汇点,m条边(对应代码中即节点u 到节点v 的最大流量为z) 求所有汇点的最大流. 2.多个源点,多个汇点的最大流. 建立一个超级源点.一个超级汇点,然 ...

随机推荐

  1. JVM 零散知识

    年轻代大小选择: 响应时间优先的应用: 尽可能设大,直到接近系统的最低响应时间限制.在此种情况下,年轻代收集发生的频率也是最小的.同时,减少到达年老代的对象. 吞吐量优先的应用: 尽可能的设置大,可能 ...

  2. SKlearn中分类决策树的重要参数详解

    学习机器学习童鞋们应该都知道决策树是一个非常好用的算法,因为它的运算速度快,准确性高,方便理解,可以处理连续或种类的字段,并且适合高维的数据而被人们喜爱,而Sklearn也是学习Python实现机器学 ...

  3. 自制Java虚拟机(四)-对象、new、invokespecial

    自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...

  4. Ubuntu14.04升级到Ubuntu16.04

    Ubuntu14.04升级到Ubuntu16.04 1.查看目前版本 lsb_release -a 2.执行更新命令 apt-get update && apt-get dist-up ...

  5. POJ1845 Sumdiv 数学?逆元?

    当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...

  6. HDU6438:Buy and Resell(贪心+数据结构)

    题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少 分析:对每一个元素产生的贡献可以先计算 ...

  7. jetty-env.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE Configure PUBLIC &quo ...

  8. ProtocBuffer安装

    学习protocolhttp://www.jianshu.com/p/fa126a8535a0 mac安装protocbuff: 下边总结一下安装流程: 查看官方文档源码在 https://githu ...

  9. Dom4j-读写xml

    1.示例代码 Document document = DocumentHelper.createDocument(); // 增加命名空间 Namespace sopa12 = Namespace.g ...

  10. Spring事务管理的注解方式

    使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...