题目链接

http://blog.csdn.net/just_sort/article/details/75448403

有源汇有上下界网络流 通过添加一条(T->S,[0,INF])的边变成无源汇

Sol1. 添加(T->S,[0,INF])的的边后,按无源汇最大流建图,跑一遍SS->TT的最大流,仅当这时flow=∑dgr时有解;

若有解,删掉(T->S,[0,INF])的这条边,此时S->T的最大流+之前的flow 就是答案

解释: 添加附加源汇是为了满足流量平衡条件,在新图中相应的补流或分流

只要连接附加源汇的边满流,则新图中S->T的任意一种可行流都是原图的可行流

跑完SS->TT的最大流后,相当于是使连接附加源汇的边满流,进而求出了一种可行流

再将T->S的边拆掉,即使S->T变成一个有源汇网络流图,跑S->T的最大流,加上之前的可行流就是最大可行流

注:删边的时候要删掉SS、TT的所有边;

或是第二次直接求S->T的最大流 可行流+残余网络的最大流 就是答案(因为SS、TT的已经流满了)。

删边不太明白。。

#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
const int N=207,M=1e4+5+N,INF=0x7fffffff; int n,m,src,des,H[N],Enum,cap[M<<1],to[M<<1],nxt[M<<1];
int q[N],lev[N],cur[N],dgr[N];
//bool id[M<<1]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v,int w)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w;
// id[Enum]=i;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;
// id[Enum]=i;
}
bool BFS()
{
for(int i=0;i<=n+1;++i) lev[i]=0,cur[i]=H[i];
lev[src]=1, q[0]=src;
int h=0,t=1;
while(h<t)
{
int x=q[h++];
for(int i=H[x];i;i=nxt[i])
if(!lev[to[i]] && cap[i])
{
lev[to[i]]=lev[x]+1, q[t++]=to[i];
if(to[i]==des) return 1;
}
}
return 0;
}
int Dinic(int u,int flow)
{
if(u==des) return flow;
int used=0;
for(int &i=cur[u];i;i=nxt[i])
if(lev[to[i]]==lev[u]+1 && cap[i])
{
int delta=Dinic(to[i],std::min(flow-used,cap[i]));
if(delta)
{
cap[i]-=delta, cap[i^1]+=delta, used+=delta;
if(used==flow) return flow;
}
}
lev[u]=0;
return used;
} int main()
{
Enum=1;
n=read(),m=read();int s=read(),t=read();
int ss=0,tt=n+1,sum=0,okflow=0;
for(int u,v,low,upp,i=1;i<=m;++i)
{
u=read(),v=read(),low=read(),upp=read(),
dgr[u]-=low,dgr[v]+=low,AddEdge(u,v,upp-low);
}
for(int i=1;i<=n;++i)
if(dgr[i]>0) sum+=dgr[i],AddEdge(ss,i,dgr[i]);
else if(dgr[i]<0) AddEdge(i,tt,-dgr[i]);
AddEdge(t,s,INF), src=ss, des=tt;
while(BFS()) okflow+=Dinic(src,INF);
if(okflow==sum)
{
// printf("%d %d\n",okflow,cap[H[tt]]);
// okflow=cap[H[tt]];//??
// H[ss]=H[tt]=0;
// for(int i=1;i<=Enum;++i)
// if(!id[i]) to[i]=0;
// src=s, des=t;
// while(BFS()) okflow+=Dinic(src,INF); src=s, des=t;
okflow=0;
while(BFS()) okflow+=Dinic(src,INF); printf("%d",okflow);
}
else printf("please go home to sleep"); return 0;
}

LOJ.116.[模板]有源汇有上下界最大流(Dinic)的更多相关文章

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

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

  2. LOJ.115.[模板]无源汇有上下界可行流(Dinic)

    题目链接 参考:http://blog.csdn.net/clove_unique/article/details/54884437 http://blog.csdn.net/wu_tongtong/ ...

  3. 有源汇有上下界最小流 DInic + 各种优化 模板

    例题:loj117 : https://loj.ac/problem/117 //其实就是判断可行流后倒着求一遍最大流 #include <iostream> #include <c ...

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

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

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

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

  6. 【模板】有源汇有上下界最大流(网络流)/ZOJ3229

    先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...

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

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

  8. 【LOJ116】有源汇有上下界最大流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...

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

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

随机推荐

  1. ROC,AUC,PR,AP介绍及python绘制

    这里介绍一下如题所述的四个概念以及相应的使用python绘制曲线: 参考博客:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculat ...

  2. ES系列目录

    ES系列一.CentOS7安装ES 6.3.1 ES系列二.CentOS7安装ES head6.3.1 ES系列三.基本知识准备 ES系列四.ES6.3常用api之文档类api ES系列五.ES6.3 ...

  3. dns轮询

    负载均衡最开始一步,利用它实现负载均衡集群的定位

  4. zabbix系列(七)zabbix3.0添加对tcp连接数及状态的监控

    原理: netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' TIME_WAIT 79 ESTABLISHED 6 LISTE ...

  5. vim使用案例

    1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录: 2. 进入 vitest 这个目录当中: 3. 将 /etc/man.config 复制到本目录底下(或由上述的连结下载 man. ...

  6. Spring boot教程mybatis访问MySQL的尝试

    Windows 10家庭中文版,Eclipse,Java 1.8,spring boot 2.1.0,mybatis-spring-boot-starter 1.3.2,com.github.page ...

  7. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  8. Laravel 中设置 Carbon 的 diffForHumans 方法返回中文

    在写 feed 流功能时,经常要用到 Carbon 的 diffForHumans 方法,以方便返回直观的时间描述. 例如 Carbon::parse($date)->diffForHumans ...

  9. Python decorator

    1.编写无参数的decorator Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法 ...

  10. MonologFX最简demo,javafx外用dialog示例

    参考blog:https://blogs.oracle.com/javajungle/entry/monologfx_floss_javafx_dialogs_for /* * To change t ...