uva 10330 Power Transmission (最大流 + 拆点)
来源:互联网 发布:虚拟光盘软件下载 编辑:程序博客网 时间:2024/06/06 01:28
uva 10330 Power Transmission
如果对最大流不熟悉的话可以先去看看这个
题目大意:先来讲解一下INPUT。首先读入一个正整数N, 接下来N个数据是N个调节器的容量;然后读入一个正整数M, 接下来M组数据代表的是M条调节器与调解器之间的线路(调节器u, 调节器v, 容量);最后的一组数据先是两个正整数a和b, 接下来的a个数据代表的是初始的调节器,最后的b个数据代表的是终结的调节器。
综上,求最大流。
解题思路:源点或汇点不唯一的时候,记得要增加超级源点或超级汇点来使得源点,汇点唯一。一开始N个调节器结点是有容量的,所以要把N个调节器给拆开,每个调节器都要拆成 调节器=调节器(左)+容量+调节器(右) ,拆点结束之后就得到一张图,然后用EK算法,算出最大流。
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>#include <queue>using namespace std;typedef long long ll;const int OF = 100;const int INF = 0x3f3f3f3f;const int N = 500;int n, m, G[N][N], f[N][N];void Input() { //把一开始的N个regulator(调节器)拆成两个点一条路 memset(G, 0, sizeof(G)); memset(f, 0, sizeof(f)); int num; for (int i = 1; i <= n; i++) { scanf("%d", &num); G[i + OF][i] = num; } scanf("%d", &m); int a, b, c; for (int i = 0; i < m; i++) { scanf("%d %d %d", &a, &b, &c); G[a][b + OF] = c; } scanf("%d %d", &a, &b); for (int i = 0; i < a; i++) { //增加超级源点 scanf("%d", &c); G[0][c + OF] = INF; } for (int i = 0; i < b; i++) { //增加超级汇点 scanf("%d", &c); G[c][n + OF + 1] = INF; }}int EK() { queue<int> Q; n = n + OF + 1; int pre[N], a[N], ans = 0; memset(f, 0, sizeof(f)); while (1) { memset(pre, 0, sizeof(pre)); memset(a, 0, sizeof(a)); a[0] = INF; Q.push(0); while (!Q.empty()) { //BFS找增广路 int u = Q.front(); Q.pop(); for (int v = 0; v <= n; v++) { if (!a[v] && G[u][v] > f[u][v]) { //找到新结点 pre[v] = u; //记录新节点的父亲 Q.push(v); //加入FIFO队列 a[v] = min(a[u], G[u][v] - f[u][v]); //s - t的最小残量 } } } if (a[n] == 0) break; //当找不到新的增广路时,就已是最大流 ans += a[n]; //更新从s流出的总流量 for (int u = n; u != 0; u = pre[u]) { //从源点s往回走 f[pre[u]][u] += a[n]; //更新正向边 f[u][pre[u]] -= a[n]; //更新反向边 } } return ans;}int main() { while (scanf("%d", &n) != EOF) { Input(); //读入数据,拆点 printf("%d\n", EK()); } return 0;}
0 0
- UVA - 10330 Power Transmission (最大流+拆点)
- uva 10330 Power Transmission (最大流 + 拆点)
- UVa 10330 - Power Transmission (最大流+拆点)
- UVa 10330 Power Transmission(最大流 + 拆点)
- UVa 10330 Power Transmission (最大流+多源多汇点+结点容量(拆点))
- UVa 10330 Power Transmission / 最大流EK
- UVA 10330 Power Transmission(网络最大流)
- UVA - 10330 Power Transmission 最大流问题
- Power Transmission - UVa 10330 最大流
- UVa10330 Power Transmission (最大流,拆点)
- uva 10330 - Power Transmission(网络流)
- uva 10330 Power Transmission (网络流)
- 10330 - Power Transmission (最大流)
- Ligthoj 1155--Power Transmission【最大流 && 拆点】
- UVA 10330 Power Transmission 网络流 拆点+多源点多汇点
- uva 10330 - Power Transmission
- UVa:10330 Power Transmission
- uva 10330Power Transmission
- Block介绍(三)解开神秘面纱(上)
- js中的一个闭包小例子
- myeclipse修改乱码(编码格式修改)
- vim操作哲学
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
- uva 10330 Power Transmission (最大流 + 拆点)
- java设计模式--单例模式
- Windows安装pip
- Write Small Functions Using Examples
- px(像素)与 dp, sp换算公式
- 1009. Product of Polynomials (25)
- error C2248: “CObject::CObject”: 无法访问private 成员(在“CObject”类中声明)
- POJ 1789
- pulltorefresh自动刷新