POJ-1459 Power Network---最大流
题目链接:
https://cn.vjudge.net/problem/POJ-1459
题目大意:
简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最多运载限定。
前4个数据就是有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条线路的数据,(起点,终点)最多运载量,然后是np个供电点的数据(供电点)最多供电量,接着就是nc个消费点的数据(消费点)最多消费电量。
题目要我们求出给定的图最大能消费的总电量(就是求最大流)
解题思路:
供电点有提供功能,那么供电点就可以当成源点,同样消费点有消费功能,可以当成汇点。
由于这题有多个供电点和消费点,我们可以增加两个点,一个超级源点和一个超级汇点。
把所有的供电点都当成是由超级源点提供电量的,所有的消费点都将消费电量转移到超级汇点上,这样就相当于转换成一个基本的网络流求最大流的题。
超级源点与供电点有一条边,边的值为供电点最大能提供的电量,消费点与超级汇点有一条边,边的值为消费点最大能消费的电量。
增加源点汇点这一技巧很常用。
- #include<iostream>
- #include<vector>
- #include<cstring>
- #include<cstdio>
- #include<queue>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int maxn = + ;
- struct edge
- {
- int u, v, c, f;
- edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
- };
- vector<edge>e;
- vector<int>G[maxn];
- int a[maxn];//找增广路每个点的水流量
- int p[maxn];//每次找增广路反向记录路径
- void init(int n)
- {
- for(int i = ; i <= n; i++)G[i].clear();
- e.clear();
- }
- void addedge(int u, int v, int c)
- {
- e.push_back(edge(u, v, c, ));
- e.push_back(edge(v, u, , ));
- int m = e.size();
- G[u].push_back(m - );
- G[v].push_back(m - );
- }
- int Maxflow(int s, int t)
- {
- int flow = ;
- for(;;)//每次寻找增广路
- {
- memset(a, , sizeof(a));//初始化每个节点的流量均为0,源点流量为INF
- a[s] = INF;
- queue<int>q;
- q.push(s);
- while(!q.empty())
- {
- int u = q.front();
- q.pop();
- for(int i = ; i < G[u].size(); i++)
- {
- edge &now = e[G[u][i]];
- int v = now.v;
- if(!a[v] && now.c > now.f)//v点还未流经,且这条路还没流满
- {
- p[v] = G[u][i];//反向记录
- a[v] = min(a[u], now.c - now.f);
- q.push(v);
- }
- }
- if(a[t])break;//已经到汇点
- }
- if(!a[t])break;//已经找不到增广路
- for(int u = t; u != s; u = e[p[u]].u)
- {
- e[p[u]].f += a[t];
- e[p[u] ^ ].f -= a[t];
- }
- flow += a[t];
- }
- return flow;
- }
- int main()
- {
- int n, np, nc, m;//分别表示点数,电站数,居民数,边数
- while(cin >> n >> np >> nc >> m)
- {
- int s = n, t = n + ;
- init(t);
- int u, v, c;
- for(int i = ; i < m; i++)//建边
- {
- while(getchar() != '(');//读取左括号
- scanf("%d,%d)%d", &u, &v, &c);
- addedge(u, v, c);
- }
- for(int i = ; i < np; i++)//对于每个电站,从源点到电站点连一条边,权值为电站发电值
- {
- while(getchar() != '(');
- scanf("%d)%d", &v, &c);
- addedge(s, v, c);
- }
- for(int i = ; i < nc; i++)//对于每个居民,从居民点到汇点连一条边,权值是居民用电值
- {
- while(getchar() != '(');
- scanf("%d)%d", &u, &c);
- addedge(u, t, c);
- }
- cout<<Maxflow(s, t)<<endl;
- }
- return ;
- }
POJ-1459 Power Network---最大流的更多相关文章
- POJ 1459 Power Network 最大流(Edmonds_Karp算法)
题目链接: http://poj.org/problem?id=1459 因为发电站有多个,所以需要一个超级源点,消费者有多个,需要一个超级汇点,这样超级源点到发电站的权值就是发电站的容量,也就是题目 ...
- 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 ...
- poj 1459 Power Network
题目连接 http://poj.org/problem?id=1459 Power Network Description A power network consists of nodes (pow ...
- 2018.07.06 POJ 1459 Power Network(多源多汇最大流)
Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...
- POJ 1459 Power Network(网络流 最大流 多起点,多汇点)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 22987 Accepted: 12039 D ...
- 网络流--最大流--POJ 1459 Power Network
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #incl ...
- poj 1459 Power Network : 最大网络流 dinic算法实现
点击打开链接 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20903 Accepted: ...
- poj 1459 Power Network【建立超级源点,超级汇点】
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 25514 Accepted: 13287 D ...
- POJ 1459 Power Network(网络最大流,dinic算法模板题)
题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数. 接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...
- POJ - 1459 Power Network(最大流)(模板)
1.看了好久,囧. n个节点,np个源点,nc个汇点,m条边(对应代码中即节点u 到节点v 的最大流量为z) 求所有汇点的最大流. 2.多个源点,多个汇点的最大流. 建立一个超级源点.一个超级汇点,然 ...
随机推荐
- JVM 零散知识
年轻代大小选择: 响应时间优先的应用: 尽可能设大,直到接近系统的最低响应时间限制.在此种情况下,年轻代收集发生的频率也是最小的.同时,减少到达年老代的对象. 吞吐量优先的应用: 尽可能的设置大,可能 ...
- SKlearn中分类决策树的重要参数详解
学习机器学习童鞋们应该都知道决策树是一个非常好用的算法,因为它的运算速度快,准确性高,方便理解,可以处理连续或种类的字段,并且适合高维的数据而被人们喜爱,而Sklearn也是学习Python实现机器学 ...
- 自制Java虚拟机(四)-对象、new、invokespecial
自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...
- Ubuntu14.04升级到Ubuntu16.04
Ubuntu14.04升级到Ubuntu16.04 1.查看目前版本 lsb_release -a 2.执行更新命令 apt-get update && apt-get dist-up ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- HDU6438:Buy and Resell(贪心+数据结构)
题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少 分析:对每一个元素产生的贡献可以先计算 ...
- jetty-env.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE Configure PUBLIC &quo ...
- ProtocBuffer安装
学习protocolhttp://www.jianshu.com/p/fa126a8535a0 mac安装protocbuff: 下边总结一下安装流程: 查看官方文档源码在 https://githu ...
- Dom4j-读写xml
1.示例代码 Document document = DocumentHelper.createDocument(); // 增加命名空间 Namespace sopa12 = Namespace.g ...
- Spring事务管理的注解方式
使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...