LightOJ 1155 - Power Transmission【拆点网络流】
2015-09-01 22:18
525 查看
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1155
1~N每个点有容量限制,这样就把每个点拆开,容量为限制的容量。
代码:
1~N每个点有容量限制,这样就把每个点拆开,容量为限制的容量。
代码:
[code]#include <iostream> #include <algorithm> #include <set> #include <map> #include <string.h> #include <queue> #include <sstream> #include <stdio.h> #include <math.h> #include <stdlib.h> using namespace std; const int MAXN = 1010;//点数的最大值 const int MAXM = 400100;//边数的最大值 const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM];//注意是MAXM int tol; int head[MAXN]; int gap[MAXN], dep[MAXN], pre[MAXN], cur[MAXN]; void init() { tol = 0; memset(head, -1, sizeof(head)); } //加边,单向图三个参数,双向图四个参数 void addedge(int u, int v, int w, int rw = 0) { edge[tol].to = v; edge[tol].cap = w; edge[tol].next = head[u]; edge[tol].flow = 0; head[u] = tol++; edge[tol].to = u; edge[tol].cap = rw; edge[tol].next = head[v]; edge[tol].flow = 0; head[v] = tol++; } //输入参数:起点、终点、点的总数 //点的编号没有影响,只要输入点的总数 int sap(int start, int end, int N) { memset(gap, 0, sizeof(gap)); memset(dep, 0, sizeof(dep)); memcpy(cur, head, sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; int ans = 0; while (dep[start] < N) { if (u == end) { int Min = INF; for (int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to]) if (Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; for (int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to]) { edge[i].flow += Min; edge[i ^ 1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for (int i = cur[u]; i != -1; i = edge[i].next) { v = edge[i].to; if (edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u]) { flag = true; cur[u] = pre[v] = i; break; } } if (flag) { u = v; continue; } int Min = N; for (int i = head[u]; i != -1; i = edge[i].next) if (edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } gap[dep[u]]--; if (!gap[dep[u]])return ans; dep[u] = Min + 1; gap[dep[u]]++; if (u != start) u = edge[pre[u] ^ 1].to; } return ans; } int m, n, s, t; int a, b, c; int store[110]; int main() { int T, cases = 1; scanf("%d", &T); while (T--) { init(); scanf("%d", &n); for (int i = 1;i <= n;i++) scanf("%d", &store[i]); for (int i = 1;i <= n;i++) addedge(i, i + n, store[i]); scanf("%d", &m); while (m--) { scanf("%d%d%d", &a, &b, &c); addedge(a + n, b, c); } scanf("%d%d", &a, &b); while (a--) { scanf("%d", &c); addedge(0, c, 11111); } while (b--) { scanf("%d", &c); addedge(c + n, 2 * n+1, 11111); } int ans = sap(0, 2 * n + 1, 2 * n + 2); printf("Case %d: %d\n", cases++, ans); } return 0; }
相关文章推荐
- Centos NAT网络配置
- C/C++-----------http协议发送字段,文件,单个和多张图片
- 浅谈HTTP中Get与Post的区别
- Linux&c 文件操作,线程进程控制,网络编程,简单知识点梳理
- hdu 4753 2013南京赛区网络赛 记忆化搜索 ****
- java基础-网络编程
- Android杂谈之网络实时监测
- 黑马程序员——Java 网络编程
- 高可用性网络
- JZ2440 ping不通PC主机的原因及解决办法
- 安卓开发 httpclient导致的闪退问题
- HttpServletRequest和ServletRequest的区别
- 谈谈如何训练一个性能不错的深度神经网络
- HTTP请求头和响应头总结
- 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式
- 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式
- TCP三次握手详解
- 如果要设计一个网络爬虫程序,该怎么避免陷入无限循环
- OkHttpClient疑虑之execute()与enqueue()同步与异步请求
- ios - 测试网络状态是否连通 判断网络状态类型