题意:

给定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 (无源汇有上下界最大流)的更多相关文章

  1. SGU 194 Reactor Cooling 无源汇带上下界可行流

    Reactor Cooling time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output ...

  2. SGU 194. Reactor Cooling(无源汇有上下界的网络流)

    时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...

  3. ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺 ...

  4. sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] ...

  5. Zoj 2314 Reactor Cooling(无源汇有上下界可行流)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意:    给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...

  6. HDU 4940 Destroy Transportation system(无源汇有上下界最大流)

    看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...

  7. hdu 4940 无源汇有上下界最大流

    /* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  8. LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)

    #115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...

  9. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

随机推荐

  1. missfresh问题记录

    一.基本信息 1.登陆机器    ssh lina02@mjump.missfresh.net -p2222 二.问题 1.分页问题:job_id为空时能查询出来(笛卡尔乘积),需要加上AND res ...

  2. LCD1602显示中文汉字

    小子在西藏 2011-11-25编写 特别说明笔者是上面的作者,感谢那些原意分享知识的人.时隔5年我又看到了笔者当年写的东西,我想这期间还有许许多多的人 今天写在博客上,愿更多后来者可以学习. LCD ...

  3. 常用的http网页错误代码表---------495引发的一个简单到爆,但基于国内环境只能呵呵呵的血案

    敲代码敲出了个网页错误代码 495. 然后,正常的跑去百度,看了一堆还是没有完整的网页错误代码,应该说国内的环境的网页错误代码表只有官方的那几个,那么只能FQ了. 去到谷歌,一查全是俄语,乐了,明白是 ...

  4. 判断字符串string是数字、json结构、xml结构

    import org.json.JSONException; import org.json.JSONObject; import org.dom4j.DocumentException; impor ...

  5. Spring中统一相同版本的api请求路径的一些思考

    Spring中统一相同版本的api请求路径的一些思考 问题场景 当我们在实际开发中,可能会遇到开发相同同版本的api, 假设相同版本的api请求路径为/v1/functionA,/v1/functio ...

  6. linux 安装jdk (二进制文件安装)

    1.下载jdk 此处以1.7 为例 :jdk-7u79-linux-x64.tar.gz 2.通过ssh将安装介质传到服务器 我一般放在 /opt 目录下 3.用tar 命令解压缩   tar -zx ...

  7. freebsd问题

    http://community.spiceworks.com/topic/91708-server-freezes

  8. AdonisJs(Node框架)学习总结

    先列出作为前端开发人员必须知道的10个NodeJs框架  AdonisJs 一个服务端渲染的MVC框架,它是 Laravel (PHP框架)的一个 NodeJS 版本. 可以安装脚手架工具adonis ...

  9. 【Python图像特征的音乐序列生成】数据集制作的一些tricks

    关于数据集的制作,我决定去掉很多不必要的东西,比如和弦,于是我选择了melody部分的旋律. 有了midi文件,我现在要abc序列,所以我要通过midi2abc转换一下文件. 批处理程序效果如下: 文 ...

  10. 如何在SAP云平台的Cloud Foundry环境下添加新的Service(服务)

    我想在SAP云平台的Cloud Foundry环境下使用MongoDB的服务,但是我在Service Marketplace上找不到这个服务. cf marketplace返回的结果也没有. 解决方案 ...