点此看题面

大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流。若存在,则输出最大流。

无源汇上下界可行流

在做此题之前,最好先去看看这道题目:【LOJ115】无源汇有上下界可行流

大致思路

首先,我们先跑一遍无源汇上下界可行流,同时判断是否有解。

等会儿,这题是有源汇的,而刚才提到的可行流是无源汇的,怎么办?

答:没关系!

直接从汇点向源点连一条下界为\(0\)、上界为\(INF\)的边,然后再按无源汇上下界可行流的套路建虚拟源汇做即可。

但还有个问题,这样跑出来的肯定不是最大流,那该怎么办?

我们只需在跑完可行流之后的图上再跑遍最大流,就可求出答案了。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 202
#define M 9999
#define min(x,y) ((x)<(y)?(x):(y))
#define INF 1e9
using namespace std;
int n,m,s,t;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
class UpperLowerMaxFlow_with_ST//有源汇有上下界最大流
{
private:
#define add(x,y,v) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].Cap=v)
#define AddOneWayEdge(x,y,v) (add(x,y,v),add(y,x,0))
static Con int Psz=N+2,Lsz=N+M+1<<1;int ee,lnk[Psz+5],cur[Psz+5],v[Psz+5],q[Psz+5],dep[Psz+5];
struct edge {int to,nxt,Cap;}e[Lsz+5];
I bool BFS(CI s,CI t)//BFS找增广路
{
RI i,k,H=1,T=1;memset(dep,0,sizeof(dep)),dep[q[1]=s]=1;W(H<=T&&!dep[t])
for(i=lnk[k=q[H++]];i;i=e[i].nxt) e[i].Cap&&!dep[e[i].to]&&(dep[q[++T]=e[i].to]=dep[k]+1);
return dep[t]?(memcpy(cur,lnk,sizeof(lnk)),true):false;
}
I int DFS(CI x,RI f,CI t)//DFS统计流量
{
if(!(x^t)||!f) return f;RI i,p,res=0;
for(i=cur[x];i;i=e[i].nxt)
{
if(cur[x]=i,(dep[x]+1)^dep[e[i].to]||!(p=DFS(e[i].to,min(f,e[i].Cap),t))) continue;
if(e[i].Cap-=p,e[((i-1)^1)+1].Cap+=p,res+=p,!(f-=p)) break;
}return !res&&(dep[x]=-1),res;
}
I bool FeasibleFlow()//无源汇有上下界可行流
{
RI i;for(i=P(1);i<=P(n);++i) v[i]>0&&AddOneWayEdge(s,i,v[i]),v[i]<0&&AddOneWayEdge(i,t,-v[i]);
W(BFS(s,t)) DFS(s,INF,t);for(i=lnk[s];i;i=e[i].nxt) if(e[i].Cap) return false;return true;
}
public:
int s,t;I UpperLowerMaxFlow_with_ST() {s=1,t=2;}I int P(CI x) {return x+2;}
I void Add(CI x,CI y,CI Lower,CI Upper) {AddOneWayEdge(x,y,Upper-Lower),v[x]-=Lower,v[y]+=Lower;}
I void MaxFlow(CI S,CI T)//最大流
{
if(Add(T,S,0,INF),!FeasibleFlow()) return (void)(puts("please go home to sleep"));
RI res=0;W(BFS(S,T)) res+=DFS(S,INF,T);printf("%d",res);//求解并输出答案
}
}V;
int main()
{
RI i,x,y,Lower,Upper;for(F.read(n,m,s,t),i=1;i<=m;++i) F.read(x,y,Lower,Upper),V.Add(V.P(x),V.P(y),Lower,Upper);//建边
return V.MaxFlow(V.P(s),V.P(t)),0;//求解答案
}

【LOJ116】有源汇有上下界最大流(模板题)的更多相关文章

  1. LOJ116 - 有源汇有上下界最大流

    原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...

  2. LOJ116 有源汇有上下界最大流(上下界网络流)

    考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...

  3. LibreOJ #116. 有源汇有上下界最大流

    二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...

  4. 【Loj116】有源汇有上下界最大流(网络流)

    [Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...

  5. loj #116. 有源汇有上下界最大流

    题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...

  6. loj #117. 有源汇有上下界最小流

    题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...

  7. LOJ.117.[模板]有源汇有上下界最小流(Dinic)

    题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...

  8. [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流

    poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...

  9. Shoot the Bullet(有源汇带上下界最大流)

    有源汇带上下界最大流 在原图基础上连一条汇点到源点流量为inf的边,将有源汇网络流转化为无源汇网络流用相同方法判断是否满流,如果满流再跑一边源点到汇点的最大流就是答案 例题:Shoot the Bul ...

随机推荐

  1. bootstrap多选框

    不多说,先上图片 本多选框是用的bootstrap的样式为基础,将弹出框css改造,然后自己写的js得到. 下面为全部页面的代码,需要的可以自己改动js,得到自己需要的效果 <!DOCTYPE ...

  2. netty在rpc MQ中的应用

    https://files.cnblogs.com/files/yszzu/netty-rpc-parent.zip https://github.com/apache/rocketmq/blob/m ...

  3. matlab的一些关于块分类的函数~~~

    1. nlfilter(General sliding-neighborhood operations) B = nlfilter(A, [m n], fun),这是一个其中A是图像[m  n]是图像 ...

  4. Android文件/文件夹选择器(支持多选操作),已封装为lib库,直接添加依赖即可。

    话不多少,先上图一览: 接下来我们开始写个app测试: 1.新建Android工程:FileSelectorTest 2.更改MainActivity: 在里面写四个textview模拟button, ...

  5. animition动画的加入

    很多时候我们把PopupWindow用作自定义的菜单,需要一个从底部向上弹出的效果,这就需要为PopupWindow添加动画. 在工程res下新建anim文件夹,在anim文件夹先新建两个xml文件 ...

  6. (转) HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

    HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手.TCP/IP协议基础.加密学) 原文:http://blog.csdn.net/itermeng/article/detai ...

  7. Unity C# 用枚举(enum)制作复选框

    最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...

  8. IsPostBack详解

    1.IsPostBack<只需要加载一次的代码放在if(!IsPostBack)中> 今天在最开始定义了全局变量取得radiobuttonlist中得到的value,但是因为autopos ...

  9. Hibernate课程 初探一对多映射3-4 双向多对一的测试

    1 单向多对一和单向多对一的区别 比如部门和员工,一个部门下有很多员工,如果只查一个员工属于哪个部门,就用单向的,如果还要查一个部门下的所有员工,就用双向的. 2 双向多对一的配置 除了单向xml和双 ...

  10. html中的兼容 & 如何对网站的文件和资源进行优化

    一.1.双边距 BUG float引起的  使用display 2.超链接hover 点击后失效  使用正确的书写顺序 link visited hover active (可简单看成由 爱生恨 lo ...