SGU 194. Reactor Cooling【无源汇上下界最大流】
2015-09-04 23:42
513 查看
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=194
当所有附加边全部满流时(即maxflow==所有du[]>0之和),有可行解。
代码:
当所有附加边全部满流时(即maxflow==所有du[]>0之和),有可行解。
代码:
[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> #include <string> 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 n, m; int in[MAXN], least[MAXM], num[MAXM]; int main() { while (~scanf("%d%d", &n, &m)) { init(); memset(in, 0, sizeof(in)); memset(least, 0, sizeof(least)); int a, b, c, d; for (int i = 1;i <= m;i++) { scanf("%d%d%d%d", &a, &b, &c, &d); num[i] = tol; least[i] = c; in[a] -= c; in[b] += c; addedge(a, b, d - c); } int sum = 0; for (int i = 1;i <= n;i++) { if (in[i] > 0) { addedge(0, i, in[i]); sum += in[i]; } else addedge(i, n + 1, -in[i]); } if (sap(0, n + 1, n + 2) != sum) puts("NO"); else { puts("YES"); for (int i = 1;i <= m;i++) printf("%d\n", edge[num[i]].flow + least[i]); } } return 0; }
相关文章推荐
- 2015前端各大框架比较(angular,vue,react,ant)
- React 实践记录 04 Flux demo
- React router
- Redux管理你的React应用
- [React] React Fundamentals: Integrating Components with D3 and AngularJS
- react.js 从零开始(四)React 属性和状态详解
- [React] React Fundamentals: with-addons - ReactLink
- React,用组件化思想写前端代码
- react-native试玩(6)-日期选择控件
- Reactor Pattern Explained
- ReactiveCocoa2 源码浅析
- react-native试玩(5)-小菊花控件
- 【前端】新手学习React遇到的一些问题
- React 实践记录 03 React router
- react.js 从零开始(三)JSX 语法及特点介绍
- 使用Redux管理你的React应用
- ReactiveCocoa入门教程:第一部分
- ReactiveCocoa-基础
- [React] Linting React JSX with ESLint (in ES6)
- react