SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流
题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少?
思路:一般求解的网络流并不考虑下界问题,即流量可以为0,在有下界时,我们只需将上界变成r-l,这时还需要满足流量守恒,增加源点s和汇点t,当点u的流入大于流出时,将点u与s连边,容量即为多出的流量。同理当u流出大于流入时,多出来的流出的流量连到汇点t;直接跑最大流;这时得到的只是网络中的可行流;
为什么处理完下界之后是这样与超级源点和汇点连边的?
因为我们建的图是建立在每条边已经满足下界的情况下的,但是这时并没有实现流量的平衡。这时就需要显式地对没有流出的流量增加流入边,即上面当输入的流量-流出的流量>0时,与源点连边。因为我们之后跑完Dinic之后,看附加边是否满流,看的就是是否填补了下界没有流出去的流量。从而实现流量平衡;
ps:对于网络流问题,无论题目的是有向还是无向图,因为是增广搜索,所以一定是建无向图。。只是cap不同
#include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
#define lowbit(x) (x&(-x))
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef long long ll;
typedef unsigned int uint;
int i,j,k,n,m;
const int M = ;
int head[M],tot;
struct Edge{
int from,to,cap,flow,Next,id;
Edge(){}
Edge(int f,int to,int cap,int Next,int id):from(f),to(to),cap(cap),Next(Next),id(id),flow(){}
}e[M<<];
inline void ins(int u,int v,int w,int id)
{
e[++tot] = Edge{u,v,w,head[u],id};
head[u] = tot;
}
int s,t,cur[M],d[];
int que[];
bool BFS()
{
rep1(i,s,t) d[i] = -;
int l = ,r = ;
que[r++] = s;d[s] = ;
while(l < r){ //[l,r)
int u = que[l++];
for(int i = head[u];i;i = e[i].Next){
int v = e[i].to;
if(d[v] < && e[i].cap > e[i].flow){ // 只考虑残量网络的弧
d[v] = d[u] + ;//扑出路径来;
que[r++] = v;
if(v == t) return true;
}
}
}
return false;
}
int DFS(int x,int a)// a表示目前为止所有弧的最小残量
{
if(x == t || a == ) return a;
int& i = cur[x];//回溯时会多次DFS到同一个点
if(i == ) i = head[x];
int flow = , f;
for(;i;i = e[i].Next){// 从上次考虑的弧开始
int v = e[i].to;
if(d[v] == d[x]+ && (f = DFS(v,min(a,e[i].cap - e[i].flow))) > ){
e[i].flow += f;
e[i^].flow -= f;
flow += f;
a -= f;// 残量-流量
if(a == ) break;
}
}
return flow;
}
int Dinic()
{
int flow = ;
while(BFS()){//仍然存在增广路时再DFS
rep1(i,s,t) cur[i] = ;//记录当前探索到的点的弧的编号
flow += DFS(s,inf);
}
return flow;
}
int l[M],ans[M];
int main()
{
//freopen("data.txt","r",stdin);
//freopen("out.txt","w",stdout);
int kase = ;
while(scanf("%d%d",&n,&m) == ){
if(kase++) puts("");
MS0(head);tot = ;MS0(d);
int u,v,r;
s = ,t = n+;
rep1(i,,m){
scanf("%d%d%d%d",&u,&v,&l[i],&r);
d[u] -= l[i];
d[v] += l[i];
ins(u,v,r-l[i],i);
ins(v,u,,);
}
rep1(i,,n){
if(d[i] > ) ins(s,i,d[i],),ins(i,s,,);
if(d[i] < ) ins(i,t,-d[i],),ins(t,i,,);
}
Dinic();
bool flag = false;
for(int d = head[s];d;d = e[d].Next){
if(e[d].cap - e[d].flow){flag = true;break;}
}
if(flag){puts("NO");continue;}
puts("YES");
rep1(i,,tot)if(e[i].id){
ans[e[i].id] = e[i].flow+l[e[i].id];
}
rep1(i,,m) printf("%d\n",ans[i]);
}
return ;
}
SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流的更多相关文章
- [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流
题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...
- 【HDU 4940】Destroy Transportation system(无源无汇带上下界可行流)
Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s repr ...
- sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] ...
- SGU 194. Reactor Cooling(无源汇有上下界的网络流)
时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...
- ZOJ 2314 (sgu 194) Reactor Cooling (无源汇有上下界最大流)
题意: 给定n个点和m条边, 每条边有流量上下限[b,c], 求是否存在一种流动方法使得每条边流量在范围内, 而且每个点的流入 = 流出 分析: 无源汇有上下界最大流模板, 记录每个点流的 in 和 ...
- SGU 194 Reactor Cooling
http://acm.sgu.ru/problem.php?contest=0&problem=194 题意:m条有向边,有上下界,求最大流. 思路:原图中有u-v low[i],high[i ...
- SGU 194 Reactor Cooling(无源无汇上下界可行流)
Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidin ...
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...
- SGU 194 Reactor Cooling 无源汇带上下界可行流
Reactor Cooling time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output ...
随机推荐
- java_spring_依赖注入(构造器)
依赖注入对象可以 手工装配(建议) 和 自动装配 package com.PersonDaoBean.test; public interface PersonDao { public abstrac ...
- nginx自定义模块编写-实时统计模块--转载
原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...
- eclipse.ini配置eclipse的启动参数
Eclipse的启动由$ECLIPSE_HOME/eclipse.ini控制,如果$ECLIPSE_HOME 没有被定义,则Eclipse安装目录下的默认eclipse.ini会生效. eclipse ...
- Python 基础【第十篇】内置类型
一.integral 类型 Python提供了两种integral类型,即int(整数)与bool(布尔值). 1.1.整数 整数的相关运算符.函数.数据类型转换 1.1.1.整数的运算符 前面已经讲 ...
- 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释
一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...
- selenium添加源码,解决打开源码不显示问题
问题1: 我已经导入了源码包,单在源码中点击get,想查看源码 WebDriver driver=new FirefoxDriver(); driver.get("http://www.ba ...
- 用fiddler工具做接口测试
接口测试的原理我理解很简单,是你发送数据,看返回数据是否正确,返回值类型是否正常,主要点是多种数据的,返回结果正常 和其他应用程序相同,java中需要知道你的参数,字段有哪些,我们就去给他造数据,而先 ...
- C#中的事件-订阅与发布
我们用一个简单的例子,来说明一下这种消息传递的机制. 有一家三口,妈妈负责做饭,爸爸和孩子负责吃...将这三个人,想象成三个类. 妈妈有一个方法,叫做“做饭”.有一个事件,叫做“开饭”.做完饭后,调用 ...
- 在DataTable中添加行和列数据
DataRow newRow = dtResult.NewRow(); newRow["ProName"] = "名字"; newRow["ProPr ...
- 免费的在线Web文件管理器:Net2FTP,Pydio,eXtplorer,KodExplorer–功能强大
https://www.freehao123.com/web-ftp/ 经常有朋友在使用一些没有带文件管理器的空间时,苦于没有办法来解压上传的文件压缩包,而如果不先上传压缩包,直接上传文件夹的话耗费的 ...