ZOJ 2314 (sgu 194) Reactor Cooling (无源汇有上下界最大流)
题意:
给定n个点和m条边, 每条边有流量上下限[b,c], 求是否存在一种流动方法使得每条边流量在范围内, 而且每个点的流入 = 流出
分析:
无源汇有上下界最大流模板, 记录每个点流的 in 和 out , 然后如果一个点 i 的in > out, 从源点i连一条边到in, out > in 就从i 连一条边到 v.
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxN = 1e5 + ;
const int maxM = 2e6 + ;
const int INF = 1e9 + ;
int n, m, S, T, ecnt;
int in[maxN], out[maxN], B[maxN];
int head[maxN];
struct {
int to, nxt, w;
} edge[maxM];
void init() {
memset(in, , sizeof(in));
memset(out, , sizeof(out));
memset(B, , sizeof(B));
ecnt = ;
memset(head, -, sizeof(head));
}
void addEdge(int u, int v, int w) {
edge[ecnt].nxt = head[u];
edge[ecnt].to = v;
edge[ecnt].w = w;
head[u] = ecnt++;
}
int depth[maxN]; bool bfs() {
memset(depth, -, sizeof(depth));
queue<int> q;
depth[S] = ;
q.push(S);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = head[u]; i != -; i = edge[i].nxt) {
int v = edge[i].to, w = edge[i].w;
if(w > && depth[v] == -) { //若该残量不为0,且V[i]还未分配深度,则给其分配深度并放入队列
depth[v] = depth[u] + ;
q.push(v);
}
}
}
if(depth[T] == -)
return false;
return true;//当汇点的深度不存在时,说明不存在分层图,同时也说明不存在增广路
}
int dfs(int u, int flow) { //u为当前节点 , flow为当前流量
if(u == T) //已经到达汇点, 直接返回
return flow; for(int i = head[u]; i != -; i = edge[i].nxt) {
int v = edge[i].to, w = edge[i].w;
if((depth[v] == depth[u] + ) && (w != )) { //注意这里要满足分层图和残量不为0两个条件
int di = dfs(v, min(flow, w));
if(di > ) {
edge[i].w -= di;
edge[i ^ ].w += di; //边是相反的两条, 奇数-1 偶数+1
return di;
}
}
}
return ; //没有増广路
}
int Dinic() {
int ans = , d = ;
while(bfs()) {
while(d = dfs(S, INF))
ans += d;
}
return ans;
}
int main() {
// freopen("1.txt","r", stdin);
ios::sync_with_stdio(false);
int Test;
cin >> Test;
while(Test--) {
cin >> n >> m;
init();
S = n + , T = n + ;
for(int i = ; i < m; i++) {
int u, v, b, c;
cin >> u >> v >> b >> c;
addEdge(u,v,c - b);
addEdge(v,u, );
B[i] = b;
out[u] += b;//记录入流
in[v] += b;// 记录出流
} int sum = ; for(int i = ; i <= n; i++) { //加边
int tmp = in[i] - out[i];
if(tmp > ) {
addEdge(S, i, tmp);
addEdge(i, S, );
sum += tmp;
} else {
addEdge(i, T, -tmp);
addEdge(T, i, );
}
} int ans = Dinic(); if(ans == sum) {
puts("YES");
for(int i = ; i < m; i ++)
printf("%d\n",B[i] + edge[i * + ].w); //输出的是下限 + 反向边
}else{
puts("NO");
}
puts("");
}
}
ZOJ 2314 (sgu 194) Reactor Cooling (无源汇有上下界最大流)的更多相关文章
- SGU 194 Reactor Cooling 无源汇带上下界可行流
Reactor Cooling time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output ...
- SGU 194. Reactor Cooling(无源汇有上下界的网络流)
时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...
- ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺 ...
- sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] ...
- Zoj 2314 Reactor Cooling(无源汇有上下界可行流)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...
- HDU 4940 Destroy Transportation system(无源汇有上下界最大流)
看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...
- hdu 4940 无源汇有上下界最大流
/* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)
#115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...
- 2018.08.20 loj#115. 无源汇有上下界可行流(模板)
传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...
随机推荐
- setTimeout的异步传输机制
setTimeout是异步的,在设置完setTimeout后,指定代码会在设定的时间后加入到任务队列,但并不是立即执行,js是单线程语言,所有的代码按顺序执行,即同步执行,同步执行的代码放在执行队列中 ...
- (转)磁盘阵列RAID原理、种类及性能优缺点对比
磁盘阵列RAID原理.种类及性能优缺点对比 原文:http://www.cnblogs.com/chuncn/p/6008173.html 磁盘阵列(Redundant Arrays of Indep ...
- Zeppelin的入门使用系列之使用Zeppelin来运行Spark SQL(四)
不多说,直接上干货! 前期博客 Zeppelin的入门使用系列之使用Zeppelin来创建临时表UserTable(三) 1. 运行年龄统计的Spark SQL (1) 输入Spark SQL时,必 ...
- MyBatis学习总结(一)
MyBatis,是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解 ...
- webpack.config.js====entry入口文件的配置
1. 一般是采用对象语法: entry: { index: './src/default/js/index.js' }, https://webpack.css88.com/concepts/ent ...
- java初探之初始化
首先明确,变量初始化是在任何方法(包括构造器)被调用之前进行的. 1.实例变量的初始化 实例变量只有当它所属的类实例化后才会存在,构造器被执行就意味着对象就被创建. 1.1.指定初始化. class ...
- Android中文件加密和解密的实现
最近项目中需要用到加解密功能,言外之意就是不想让人家在反编译后通过不走心就能获取文件里一些看似有用的信息,但考虑到加解密的简单实现,这里并不使用AES或DES加解密 为了对android中assets ...
- countUp 动画展示数字变化
html <p id="countUp" style="font-size:25px;height:25px;background-color:#0aa;" ...
- iOS VIPER架构(三)
路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...
- js插件设置innerHTML时,在IE8下报错“未知运行时错误”
问题描述: 网站中使用了一个js插件,设置innerHTML时,在IE8下报错“未知运行时错误”: <div id=”divContainer”> <a name=”link”> ...