poj1459 Power Network (最大流)
2015-01-13 19:49
381 查看
题意:
一个电力网络,一共n个节点,m条边,np个发电站,nc个用户。每条边有一个容量,每个发电站有一个最大负载,每一个用户也有一个最大接受量。
问最多能供给多少电力。
思路:
多源多汇的最大流,设一个超级源点,与每一个源点连一条容量为最大负载的边,设一个超级汇点,每一个用户与超级汇点连一条容量为最大接受量的边,然后求最大流。
代码(1396K,766MS):
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> #define INF 0x3f3f3f3f #define T (n + 1) using namespace std; struct Edge{ int from, to, cap, flow; Edge() {} Edge(int a, int b, int c, int d) : from(a), to(b), cap(c), flow(d) {} }; int n, np, nc, m; vector<Edge> edges; vector<int> G[105]; void addEdge(int from, int to, int cap) { edges.push_back(Edge(from, to, cap, 0)); edges.push_back(Edge(to, from, 0, 0)); int siz = edges.size(); G[from].push_back(siz - 2); G[to].push_back(siz - 1); } int cur[105]; int layer[105]; bool build() { memset(layer, -1, sizeof(layer)); queue<int> q; q.push(0); layer[0] = 0; while (!q.empty()) { int current = q.front(); q.pop(); for (int i = 0; i < G[current].size(); i++) { Edge e = edges[G[current][i]]; if (layer[e.to] == -1 && e.cap > e.flow) { layer[e.to] = layer[current] + 1; q.push(e.to); } } } return layer[T] != -1; } int find(int x, int curflow) { if (x == T || !curflow) return curflow; int f, flow = 0; for (int &i = cur[x]; i < G[x].size(); i++) { Edge &e = edges[G[x][i]]; if (layer[e.to] == layer[x] + 1 && (f = find(e.to, min(curflow, e.cap - e.flow)))) { e.flow += f; edges[G[x][i] ^ 1].flow -= f; flow += f; curflow -= f; if (!curflow) break; } } return flow; } int dinic() { int maxflow = 0; while (build()) { memset(cur, 0, sizeof(cur)); maxflow += find(0, INF); } return maxflow; } int main() { while (~scanf("%d %d %d %d", &n, &np, &nc, &m)) { char t; int a, b, c; for (int i = 0; i <= n; i++) G[i].clear(); edges.clear(); for (int i = 0; i < m; i++) { cin >> t >> a >> t >> b >> t >> c; addEdge(a + 1, b + 1, c); } for (int i = 0; i < np; i++) { cin >> t >> a >> t >> b; addEdge(0, a + 1, b); } for (int i = 0; i < nc; i++) { cin >> t >> a >> t >> b; addEdge(a + 1, T, b); } int ans = dinic(); printf("%d\n", ans); } return 0; }
相关文章推荐
- POJ 1459-Power Network(网络流_最大流)
- poj1459 Power Network(最大流)
- poj 1459 Power Network : 最大网络流 dinic算法实现
- POJ 1459 Power Network 最大流水题
- poj 1459 Power Network(网络流最大流,多源点多汇点)
- POJ1459[Power Network]--最大流
- POJ 1459 Power Network 最大流
- poj 1459 Power Network, 最大流,多源多汇
- POJ - 1459 Power Network(网络流-最大流)
- POJ1459 Power Network(最大流)
- POJ1459 Power Network(多源点网络流,最大流,EK算法)
- 【最大流】POJ-1459 Power Network
- POJ 1459 Power Network(网络流 最大流 多起点,多汇点)
- poj 1459 Power Network 最大流
- poj 1459 Power Network (最大流)
- poj1087 A Plug for UNIX & poj1459 Power Network (最大流)
- POJ1459 Power Network【最大流】【Edmond-Karp】
- poj1459 Power Network(多源多汇最大流)
- poj 1459 Power Network (最大流)
- POJ 1459 Power Network 最大流