Ligthoj 1155--Power Transmission【最大流 && 拆点】
来源:互联网 发布:gartner 云计算 2017 编辑:程序博客网 时间:2024/05/19 03:28
DESA is taking a new project to transfer power. Power is generated by the newly established plant in Barisal. The main aim of this project is to transfer Power in Dhaka. As Dhaka is a megacity with almost 10 million people DESA wants to transfer maximum amount of power through the network. But as always occurs in case of power transmission it is tough to resist loss. So they want to use some regulators whose main aims are to divert power through several outlets without any loss.
Each such regulator has different capacity. It means if a regulator gets 100 units of power and its capacity is 80 units then remaining 20 units of power will be lost. Moreover each unidirectional link (connectors among regulators) has a certain capacity. A link with capacity 20 units cannot transfer power more than 20 units. Each regulator can distribute the input power among the outgoing links so that no link capacity is over flown. DESA wants to know the maximum amount of power which can be transmitted throughout the network so that no power loss occurs. That is the job you have to do.
(Do not try to mix the above description with the real power transmission.)
Input
Input starts with an integer T (≤ 50), denoting the number of test cases.
The input will start with a positive integer N (1 ≤ N ≤ 100) indicates the number of regulators. The next line contains N positive integers indicating the capacity of each regulator from1 to N. All the given capacities will be positive and not greater than 1000. The next line contains another positive integer M which is the number of links available among the regulators. Each of the following M lines contains three positive integers i j C. 'i' and 'j' are the regulator index (1 ≤ i, j ≤ N, i ≠ j, 1 ≤ C ≤ 1000) and C is the capacity of the link. Power can be transferred from ith regulator to jth regulator. From a regulator i to another regulator j, there can be at most one link.
The next line contains two positive integers B and D (1 ≤ B, D and B + D ≤ N). B is the number of regulators which are the entry point of the network. Power generated in Barisal must enter in the network through these entry points. Similarly D is the number of regulators connected to Dhaka. These links are special and have infinite capacity. Next line will contain B+Dintegers each of which is an index of regulator. The first B integers are the index of regulators connected with Barisal. Regulators connected with Barisal are not connected with Dhaka.
Output
For each case of input, print the case number and the maximum amount of power which can be transferred from Barisal to Dhaka.
Sample Input
Output for Sample Input
2
4
10 20 30 40
6
1 2 5
1 3 10
1 4 13
2 3 5
2 4 7
3 4 20
3 1
1 2 3 4
2
50 100
1
1 2 100
1 1
1 2
Case 1: 37
Case 2: 50
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#define maxn 1000#define maxm 400000#define INF 0x3f3f3f3fusing namespace std;int n, m;int outset, inset;int power[maxn];struct node { int u, v, cap, flow, next;};node edge[maxm];int head[maxn], cnt, cur[maxn];int vis[maxn], dist[maxn];void init(){ cnt = 0; memset(head, -1, sizeof(head));}void add(int u, int v, int w){ edge[cnt] = {u, v, w, 0, head[u]}; head[u] = cnt++; edge[cnt] = {v, u, 0, 0, head[v]}; head[v] = cnt++;}void getmap(){ scanf("%d", &n); outset = 0; inset = 2 * n + 1; for(int i = 1; i <= n; ++i){ scanf("%d", &power[i]); add(i, i + n, power[i]); } int a, b, c; scanf("%d", &m); for(int i = 1; i <= m; ++i){ scanf("%d%d%d",&a, &b, &c); add(a + n, b, c); } int B, D; scanf("%d%d", &B, &D); while(B--){ scanf("%d", &a); add(outset, a, power[a]); } while(D--){ scanf("%d", &a); add(a + n, inset, power[a]); }}bool BFS(int st ,int ed){ queue<int>q; memset(vis, 0 ,sizeof(vis)); memset(dist, -1, sizeof(dist)); vis[st] = 1; dist[st] = 0; q.push(st); while(!q.empty()){ int u = q.front(); q.pop(); for(int i = head[u]; i != -1; i = edge[i].next){ node E = edge[i]; if(!vis[E.v] && E.cap > E.flow){ vis[E.v] = 1; dist[E.v] = dist[u] + 1; if(E.v == ed) return true; q.push(E.v); } } } return false;}int DFS(int x, int ed, int a){ if(x == ed || a == 0) return a; int flow = 0, f; for(int &i = cur[x]; i != -1; i = edge[i].next){ node &E = edge[i]; if(dist[E.v] == dist[x] + 1 && (f = DFS(E.v, ed, min(a, E.cap - E.flow))) > 0){ E.flow += f; edge[i ^ 1].flow -= f; a -= f; flow += f; if(a == 0) break; } } return flow;}int maxflow(int st, int ed){ int flowsum = 0; while(BFS(st,ed)){ memcpy(cur, head, sizeof(head)); flowsum += DFS(st, ed, INF); } return flowsum;}int kcase = 1;int main (){ int T; scanf("%d", &T); while(T--){ init(); getmap(); printf("Case %d: %d\n", kcase++, maxflow(outset, inset)); } return 0;}
- Ligthoj 1155--Power Transmission【最大流 && 拆点】
- Ligthoj 1154--Penguins【最大流 && 拆点】
- UVa10330 Power Transmission (最大流,拆点)
- UVa 10330 - Power Transmission (最大流+拆点)
- UVa 10330 Power Transmission(最大流 + 拆点)
- UVA - 10330 Power Transmission (最大流+拆点)
- uva 10330 Power Transmission (最大流 + 拆点)
- LightOJ 1155Power Transmission 最大流
- LightOJ 1155 - Power Transmission【拆点网络流】
- lightoj 1155 - Power Transmission 【多源多汇 拆点网络流】
- UVa 10330 Power Transmission (最大流+多源多汇点+结点容量(拆点))
- 10330 - Power Transmission (最大流)
- lightoj--1155--Power Transmission(最大流拆点)
- UVa 10330 Power Transmission / 最大流EK
- UVA 10330 Power Transmission(网络最大流)
- UVA - 10330 Power Transmission 最大流问题
- Power Transmission - UVa 10330 最大流
- UVA 10330 Power Transmission 网络流 拆点+多源点多汇点
- Python: Soft_max 分类器
- cocopods 一直报错找不到头文件的问题解决办法
- (C#)OPC客户端源码
- 如何在Visio中自定义连接点画斜线
- QT快速读取数据量很大的Excel文件
- Ligthoj 1155--Power Transmission【最大流 && 拆点】
- Linux下使用dosemu编写汇编程序
- C++、C#、java算法学习日记04----二分插入排序
- 形象谈匈牙利
- Android自定义折线图
- java静态代理和动态代理
- OJ之阶乘之和
- kNN(K-Nearest Neighbor)最邻近规则分类
- windowsPE制作工具