[POJ 1459 Power Network] Dinic网络流
2017-04-28 14:33
435 查看
[POJ 1459 Power Network] Dinic网络流
分类:Graph
Max Flow
1. 题目链接
[POJ 1459 Power Network]2. 题意描述
一个电网包含一些结点(电站、消费者、调度站),这些结点通过电线连接。每个结点u 可能被供给s(u)的电能,s(u)≥0;同时也可能产生p(u)的电能,0≤p(u)≤pmax(u);站点u 还有可能消费c(u)电能,0≤c(u)≤min( s(u), cmax(u) );可能传输d(u)的电能,d(u) = s(u) + p(u) - c(u)。以上这些量存在以下限制关系:对每个电站,c(u) = 0;对每个消费者,p(u) = 0;对每个调度站,p(u) = c(u) = 0。
在电网中两个结点u 和v 之间最多有一条电线连接。从结点u 到结点v 传输L(u,v)的电能,0≤L(u,v)≤Lmax(u,v)。定义Con 为c(u)的总和,表示电网中消费电能的总和。本题的目的是求Con 的最大值。
电网的一个例子如图 所示。在图(a)中,电站结点u 的标记”x/y”代表p(u) = x、pmax(u) =y。消费者结点u 的标记”x/y”代表c(u) = x、cmax(u) = y。每条电线所对应的边(u,v),其标记”x/y”代表L(u,v) = x、Lmax(u,v) = y。在图(b)中,消费的最大电能Con = 6,图(a)列出了在此状态下各个站点的s(u)、p(u)、c(u)和d(u)。注意,如图(b)所示的电网中,电能的流动还存在其他状态,但消费的电能总和不超过6。
输入描述:
输入文件中包含多个测试数据。每个测试数据描述了一个电网。每个测试数据的第1行为4个整数:n np nc m,其中,0≤n≤100,代表结点数目; 0≤np≤n,代表电站数目;0≤nc≤n,代表消费者数目;0≤m≤n2,代表传输电线的数目。接下来有m 个三元组,(u,v)z,其中u和v为结点序号(结点序号从0 开始计起),0≤z≤1000,代表Lmax(u,v)的值。接下来有np 个二元组,(u)z,其中u 为电站结点的序号,0≤z≤10000,代表pmax(u)的值;每个测试数据的最后是nc 个二元组,(u)z,其中u 为消费者结点的序号, 0≤z≤10000,代表cmax(u)的值。所有数据都是整数。除三元组(u,v)z 和二元组(u)z 中不含空格外,输入文件中其他位置允许出现空格。测试数据一直到文件尾。
3. 解题思路
比较基础的一道网络流。新建一个源点s以及一个汇点t。将源点s到所有的电站连一条边,容量为每个电站所能产生的最大能量;将所有的消费节点与汇点t连一条边,容量为每个消费节点所能消费的最大能量。最后跑一下Dinic就好了。
4. 实现代码
#include <queue> #include <stack> #include <ctime> #include <cmath> #include <cctype> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; typedef long double LB; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; typedef vector<int> VI; const int INF = 0x3f3f3f3f; const LL INFL = 0x3f3f3f3f3f3f3f3fLL; void debug() { cout << endl; } template<typename T, typename ...R> void debug (T f, R ...r) { cout << "[" << f << "]"; debug (r...); } const int MX = 105; // 点数 const int MS = 2*MX*MX; // 边数 template<class T> struct Max_Flow { int n; int Q[MX], sign; int head[MX], level[MX], cur[MX], pre[MX]; int nxt[MS], pnt[MS], E; T cap[MS]; void Init (int n) { E = 0; this->n = n + 1; fill (head, head + this->n, -1); } void Add (int from, int to, T c, T rw = 0) { pnt[E] = to; cap[E] = c; nxt[E] = head[from]; head[from] = E++; pnt[E] = from; cap[E] = rw; nxt[E] = head[to]; head[to] = E++; } bool BFS (int s, int t) { sign = t; fill (level, level + n, -1); int *front = Q, *tail = Q; *tail++ = t; level[t] = 0; while (front < tail && level[s] == -1) { int u = *front++; for (int e = head[u]; e != -1; e = nxt[e]) { if (cap[e ^ 1] > 0 && level[pnt[e]] < 0) { level[pnt[e]] = level[u] + 1; *tail++ = pnt[e]; } } } return level[s] != -1; } void Push (int t, T &flow) { T mi = INF; int p = pre[t]; for (int p = pre[t]; p != -1; p = pre[pnt[p ^ 1]]) { mi = min (mi, cap[p]); } for (int p = pre[t]; p != -1; p = pre[pnt[p ^ 1]]) { cap[p] -= mi; if (!cap[p]) { sign = pnt[p ^ 1]; } cap[p ^ 1] += mi; } flow += mi; } void DFS (int u, int t, T &flow) { if (u == t) { Push (t, flow); return; } for (int &e = cur[u]; e != -1; e = nxt[e]) { if (cap[e] > 0 && level[u] - 1 == level[pnt[e]]) { pre[pnt[e]] = e; DFS (pnt[e], t, flow); if (level[sign] > level[u]) { return; } sign = t; } } } T Dinic (int s, int t) { pre[s] = -1; T flow = 0; while (BFS (s, t) ) { copy (head, head + n, cur); DFS (s, t, flow); } return flow; } }; Max_Flow<LL>F; char buf[50]; void rd() { scanf ("%s", buf); for (int i = 0; buf[i]; ++i) if (!isdigit (buf[i]) ) buf[i] = ' '; } int main() { #ifdef ___LOCAL_WONZY___ freopen ("input.txt", "r", stdin); #endif // ___LOCAL_WONZY___ int n, nc, np, m, u, v, c; while (~scanf ("%d %d %d %d", &n, &np, &nc, &m) ) { F.Init (n + 2); for (int i = 1; i <= m; ++i) { rd(); sscanf (buf, "%d %d %d", &u, &v, &c); F.Add (u, v, c); } for (int i = 1; i <= np; ++i) { rd(); sscanf (buf, "%d %d", &u, &c); F.Add (n, u, c); } for (int i = 1; i <= nc; ++i) { rd(); sscanf (buf, "%d %d", &u, &c); F.Add (u, n + 1, c); } LL ans = F.Dinic (n, n + 1); printf ("%lld\n", ans); } #ifdef ___LOCAL_WONZY___ cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl; #endif // ___LOCAL_WONZY___ return 0; }
相关文章推荐
- poj 1459 Power Network(网络流 最大流 dinic模板题)
- poj 1459 Power Network(网络流+dinic)
- poj 1459 Power Network(网络流+dinic)
- POJ 1459 Power Network 网络流
- poj 1459 Power Network(网络流_最大流)
- POJ训练计划1459_Power Network(网络流最大流/Dinic)
- poj 1459 Power Network(网络流最大流,多源点多汇点)
- POJ 1459 Power Network 网络流模板题
- POJ 1459-Power Network(网络流_最大流)
- POJ 1459 PowerNetwork 多源点网络流入门(EK算法求最大流)
- poj1459 Power Network网络流最大流基础题
- poj 1459 Power Network 【图论-网络流-最大流-EK】
- poj1459 Power Network --- 最大流 EK/dinic
- POJ 1459 Power Network 网络流基础题
- poj 1459 Power Network(网络流)
- 【最大流 模板 Dinic】POJ 1459 Power Network
- POJ1459(Power Network)【网络流】
- POJ 1459 Power Network (最大流, 网络流, EdmondsKarp算法求解最大流)
- POJ1459 Power Network(网络流)
- POJ1459-Power Network-网络流-最大流(EK模板题)