题目链接

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. nodejs 使用http模块保存源码

    var xpath=require("xpath"); var fs=require("fs"); var dom = require('xmldom').DO ...

  2. tomcat端口冲突,多个tomcat同时启动问题

    一台PC机上安装了两个tomcat,需要同时启动,每个tomcat上跑一个程序,但是现在提示端口号冲突,需要手动更改. 需要修改/conf/server.xml四个地方: 1.<Server p ...

  3. 超级wifi

    超级wifi (super wi-fi)是相对于现有的wifi提出的改进版,执行响应的 802.11af标准. 802.11af 标准是2014年2月提出的,它的主要特点是"建议在电视频率之 ...

  4. PYTHON-模块-time&datetime-练习 +目录规范

    # 作业# 1.请写出规范目录# 并解释各文件夹的作用bin 可执行文件conf 配置文件core 主要业务逻辑db 数据文件lib 库(公共代码 第三方模块)log 日志文件 # 2.改造atm + ...

  5. shell expect权威指南和实战

    一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而expec ...

  6. 将日期或数据转换为char数据类型 TO_CHAR(x[[,c2],C3])

    TO_CHAR(x[[,c2],C3])[功能]将日期或数据转换为char数据类型[参数]x是一个date或number数据类型.c2为格式参数c3为NLS设置参数如果x为日期nlsparm=NLS_ ...

  7. 测试开发之Django——No7.Django模板中的过滤器

    1.add 将参数添加到值. 例如: {{ value|add:"2" }} 如果value是4,那么输出将是6. 此过滤器将首先尝试将两个值强制转换为整数.如果失败,它将尝试将值 ...

  8. LeetCode(50):Pow(x, n)

    Medium! 题目描述: 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, ...

  9. 【ES】代码例子

    #!/usr/bin/env python #coding=utf-8 from elasticsearch import Elasticsearch from elasticsearch_dsl i ...

  10. [PHP] 链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...