LOJ115 无源汇有上下界可行流(上下界网络流)
假设初始流为每条边的下界。但这样可能流量会不守恒,我们需要在上面加上一个附加流使流量守恒。只要让每个点开始的出/入流量与原初始流相等就可以求出附加流了。那么新建超源S超汇T,令degree[i]表示流入i的边的下界之和-从i流出的边的下界之和。
若degree[i]>0,则表示需要有额外degree[i]的流量流入i来达到流量平衡,那么从S向i连上界为degree[i]的边。
若degree[i]<0,则表示需要有额外degree[i]的流量从i流出来达到流量平衡,那么从i向T连上界为-degree[i]的边。
跑最大流就可以求出附加流。显然maxflow<=sigma(degree[i])。如果maxflow=sigma(degree[i]),那么有可行流。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int read()
- {
- int x=,f=;char c=getchar();
- while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
- while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
- return x*f;
- }
- #define N 210
- #define M 50000
- #define S 0
- #define T 201
- #define inf 1000000000
- int n,m,t=-,p[N],degree[N],l[M],tot=;
- int cur[N],d[N],q[N],ans=;
- struct data{int to,nxt,cap,flow;
- }edge[M];
- void addedge(int x,int y,int z)
- {
- t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,p[x]=t;
- t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,edge[t].flow=,p[y]=t;
- }
- bool bfs()
- {
- memset(d,,sizeof(d));d[S]=;
- int head=,tail=;q[]=S;
- do
- {
- int x=q[++head];
- for (int i=p[x];~i;i=edge[i].nxt)
- if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
- {
- d[edge[i].to]=d[x]+;
- q[++tail]=edge[i].to;
- }
- }while (head<tail);
- return ~d[T];
- }
- int work(int k,int f)
- {
- if (k==T) return f;
- int used=;
- for (int i=cur[k];~i;i=edge[i].nxt)
- if (d[k]+==d[edge[i].to])
- {
- int w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow));
- edge[i].flow+=w,edge[i^].flow-=w;
- if (edge[i].flow<edge[i].cap) cur[k]=i;
- used+=w;if (used==f) return f;
- }
- if (used==) d[k]=-;
- return used;
- }
- void dinic()
- {
- while (bfs())
- {
- memcpy(cur,p,sizeof(p));
- ans+=work(S,inf);
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("loj115.in","r",stdin);
- freopen("loj115.out","w",stdout);
- const char LL[]="%I64d";
- #else
- const char LL[]="%lld";
- #endif
- n=read(),m=read();
- memset(p,,sizeof(p));
- for (int i=;i<=m;i++)
- {
- int x=read(),y=read(),low=read(),high=read();
- addedge(x,y,high-low);
- degree[y]+=low,degree[x]-=low;
- l[i]=low;
- }
- for (int i=;i<=n;i++)
- if (degree[i]>) addedge(S,i,degree[i]),tot+=degree[i];
- else if (degree[i]<) addedge(i,T,-degree[i]);
- dinic();
- if (ans<tot) cout<<"NO";
- else
- {
- cout<<"YES\n";
- for (int i=;i<=m;i++)
- printf("%d\n",edge[i-<<].flow+l[i]);
- }
- return ;
- }
LOJ115 无源汇有上下界可行流(上下界网络流)的更多相关文章
- 【LOJ115】无源汇有上下界可行流(模板题)
点此看题面 大致题意: 给你每条边的流量上下界,让你判断是否存在可行流.若有,则还需输出一个合法方案. 大致思路 首先,每条边既然有一个流量下界\(lower\),我们就强制它初始流量为\(lower ...
- LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)
#115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...
- ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...
- 2018.08.20 loj#115. 无源汇有上下界可行流(模板)
传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...
- hdu 4940 Destroy Transportation system (无源汇上下界可行流)
Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- zoj 2314 Reactor Cooling (无源汇上下界可行流)
Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...
- [loj#115] 无源汇有上下界可行流 网络流
#115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题 ...
- zoj2314 无源汇上下界可行流
题意:看是否有无源汇上下界可行流,如果有输出流量 题解:对于每一条边u->v,上界high,下界low,来说,我们可以建立每条边流量为high-low,那么这样得到的流量可能会不守恒(流入量!= ...
- loj#115. 无源汇有上下界可行流
\(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...
- Zoj 2314 Reactor Cooling(无源汇有上下界可行流)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...
随机推荐
- 利用arduino制作瓦力万年历-1.0
转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 直接先上图: 主要实现: 1.使用了arduino uno R3,因为瓦力内部空间有限,如果 ...
- Linux下NTP服务器配置
简介 原理 配置ntp服务器 进行同步 一.简介 在计算时间的时候,最准确的计算应该是使用『原子震荡周期』所计算的物理时钟了( Atomic Clock, 也被称为原子钟 ),这也被定义为标准时间(I ...
- MSComm控件与Win32 API操作串口有何区别?
MSComm控件与Win32 API操作串口有何区别? [问题点数:50分,结帖人shell_shell] 收藏帖子 回复 我是一个小兵,在战场上拼命! 结帖率 83.33% 我以前用MSCo ...
- Shiro的认证授权
shiro安全框架入门整理 package com.shiro.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro ...
- Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别(转载)
预备知识:SQL Server的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:ide ...
- Python 学习 第一篇:数据类型(数字,集合,布尔类型,操作符)
Python语言最常用的对象是变量和常量,常量的值是字面意思,其值是不可变的,变量的值是可变的,例如,123,"上海"是常量,而a=1,a=2,其中a是变量名.内置的核心数据类型有 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...
- PHP从入门到精通(五)
字符串三种声明方式 1."":双引号中可以解析变量"{$a}",双引号中可以使用任何转义字符:2.'':单引号中不可以解析变量,单引号中不可以使用转义字符(但是 ...
- 雅思听听app
最近本人呢,正在紧张的备战雅思考试,因为英语基础很弱,尤其是听力,所以老师推荐了雅思听听这个app,说是特别好使,用了一个多月的,总体来说感觉还是很nice的,但是还有一些小毛病,不过这小毛病瑕不掩瑜 ...
- 《移山之道》Reading Task——by12061154Joy
最近因为作业的原因所以接触到了这本书,给我最特别的感觉就是很新鲜,主要是因为这本书是以故事展开的,大概是我读的书太少,基本没有看到过专业书的知识体系是用故事串讲起来的,这样帮助读者理解了一些概念并且不 ...