1 条题解
-
0
解题思路
这是一个典型的网络流问题,可以通过构建流网络并使用最大流算法来解决。具体步骤如下:
构建流网络:
- 添加超级源点连接到所有发电站,容量为
- 添加超级汇点,所有消费者连接到,容量为
- 保留原始网络的传输线,容量为
计算最大流:
- 使用Dinic算法或Edmonds-Karp算法计算从到的最大流
- 这个最大流值就是网络能支持的最大电力消耗
解决代码:
#include <iostream> #include <cstring> #include <queue> #include <limits.h> #include <cstdio> using namespace std; #define min(x,y) x < y ? x : y const int MAXN = 105; int a[MAXN], p[MAXN], cap[MAXN][MAXN], flow[MAXN][MAXN]; int n, np, nc, m; int ek(int s, int t) { int f = 0; memset(p, 0, sizeof(p)); memset(flow, 0, sizeof(flow)); queue<int> q; while(true) { memset(a, 0, sizeof(a)); q.push(s); a[s] = INT_MAX; while(!q.empty()) { int u = q.front(); q.pop(); for(int v = 0; v <= n+2; v++) { if(!a[v] && cap[u][v] > flow[u][v]) { p[v] = u; q.push(v); a[v] = min(a[u], cap[u][v] - flow[u][v]); } } } if(0 == a[t]) break; for(int u = t; u != s; u = p[u]) { flow[p[u]][u] += a[t]; flow[u][p[u]] -= a[t]; } f += a[t]; } return f; } int main() { while(~scanf("%d%d%d%d", &n, &np, &nc, &m)) { memset(cap, 0, sizeof(cap)); for(int i = 0; i < m; i++) { int b, c, d; scanf(" (%d,%d)%d", &b, &c, &d); cap[b+1][c+1] = d; } for(int i = 0; i < np; i++) { int b, c; scanf(" (%d)%d", &b, &c); cap[0][b+1] = c; } for(int i = 0; i < nc; i++) { int b, c; scanf(" (%d)%d", &b, &c); cap[b+1][n+2] = c; } printf("%d\n", ek(0, n+2)); } return 0; }
- 1
信息
- ID
- 460
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者