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到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...
随机推荐
- Jenkins执行yarn install报错:error An unexpected error occurred:"... ... :Unexpected end of JSON input"
解决方式: # cd /usr/local/n/versions/node/11.6.0/lib/(node的安装目录下) # rm -rf node_modules # yarn cache cle ...
- opencv 形态学膨胀和腐蚀以及开运算和闭运算
- Spring Boot Admin 监控中心
Spring Boot Admin 监控中心 Spring Boot Admin用来收集微服务系统的健康状态.会话数量.并发数.服务资源.延迟等度量信息 服务端 建立spring-cloud-admi ...
- File类。
File类: java.io.File 类.是文件和文件夹目录名的抽象表示形式. 可以用File对文件和文件夹进行 创建,删除,获取等操作. File类的一些静态成员变量: static String ...
- Java基本语法和变量
1基本语法 1.1 标识符.关键字 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等. 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,不能以数字开头, 不 ...
- 提升Java代码质量(一)
博主双12入手了一本"Effective Java第二版",本系列文章将初步梳理书中内容,我也查了些资料,我会针对知识点做一点展开,方便以后复习回顾; Item1.考虑用静态工厂代 ...
- win7 dos窗口模拟帧刷新
前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧.- -~ 这个程序就是打开后,在Dos窗口内模拟写出几行字母.其实主要就是模拟 ...
- jsp页面file标签上传图片以及blob类型数据库存取。
我的jsp页面表单如下: <form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" ...
- Python3+Selenium3+webdriver学习笔记5(模拟常用键盘和鼠标事件)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriverfrom selenium.webdriver.co ...
- img标签src资源无法加载,报net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION错
html代码: chrome和360浏览器均报错,系统自带IE.Firefox浏览器没有问题 原因:加载的资源名含有半角逗号(,)或者别的特殊符号 解决办法:后台给资源名加上双引号("&qu ...