题目:

无源汇可行流例题

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314


题解:

证明什么的就算了,下面给出一种建图方式

1.建虚拟的S和T

2.每一条原图的边(u,v),设最大容量是Max,最小是Min,建一条容量为Max-Min的边(u,v),同时令ind[v]和oud[u]+=Min,表示实际应该多流入(出)的流量

3.对于每个点u,如果ind[u]>oud[u],为了满足流量平衡条件,所以让S和u连一条容量为ind[u]-oud[u]的边

        如果ind[u]<oud[u],同理,我们让u和T连一条容量为oud[u]-ind[u]的边

4.跑最大流

5.如果S的出边都流满就说明有解,反之没有

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 205
#define M 100005
#define INF 0x3f3f3f3f
using namespace std;
int TT,n,m,S,T,ans,sum,dis[N],cur[N],u[M],v[M],mi[M],ma[M],ind[N],oud[N],ecnt=,head[N];
queue<int> q;
struct adj{int nxt,v,w;}e[M];
int read()
{
int ret=,neg=;char j=getchar();
for (;j>'' || j<'';j=getchar())
if (j=='-') neg=-;
for (;j>='' && j<='';j=getchar())
ret=ret*+j-'';
return ret*neg;
}
void add(int u,int v,int w)
{
e[++ecnt].v=v;e[ecnt].w=w;e[ecnt].nxt=head[u];head[u]=ecnt;
e[++ecnt].v=u;e[ecnt].w=;e[ecnt].nxt=head[v];head[v]=ecnt;
}
void init()
{
ans=sum=;ecnt=;
for (int i=;i<=T;i++)
ind[i]=oud[i]=head[i]=;
}
bool Bfs()
{
while (!q.empty()) q.pop();
for (int i=;i<=T;i++)
cur[i]=head[i],dis[i]=-;
dis[S]=;q.push(S);
while (!q.empty())
{
int u=q.front();q.pop();
for (int i=head[u],v;i;i=e[i].nxt)
if (e[i].w && dis[v=e[i].v]==-)
{
dis[v]=dis[u]+,q.push(v);
if (v==T) return ;
}
}
return ;
}
int Dfs(int u,int flow)
{
if (u==T) return flow;
int ret=,delta;
for (int &i=cur[u],v;i;i=e[i].nxt)
if (e[i].w && dis[v=e[i].v]==dis[u]+)
{
delta=Dfs(v,min(e[i].w,flow-ret));
if (delta)
{
e[i].w-=delta;
e[i^].w+=delta;
ret+=delta;
if (ret==flow) break;
}
}
return ret;
}
int main()
{
TT=read();
while (TT--)
{
n=read();m=read();S=n+;T=n+;
init();
for (int i=;i<=m;i++)
{
u[i]=read();v[i]=read();mi[i]=read();ma[i]=read();
add(u[i],v[i],ma[i]-mi[i]);
oud[u[i]]+=mi[i],ind[v[i]]+=mi[i];
}
for (int i=;i<=n;i++)
if (ind[i]>oud[i])
add(S,i,ind[i]-oud[i]),sum+=ind[i]-oud[i];
else
add(i,T,oud[i]-ind[i]);
while (Bfs())
ans+=Dfs(S,INF);
if (ans<sum)
puts("NO");
else
{
puts("YES");
for (int i=;i<=m;i++)
printf("%d\n",mi[i]+e[i*+].w);
}
}
return ;
}

ZOJ 2314 Reactor Cooling | 无源汇可行流的更多相关文章

  1. ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...

  2. ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺 ...

  3. ZOJ 2314 Reactor Cooling [无源汇上下界网络流]

    贴个板子 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  4. ZOJ 1314 Reactor Cooling | 上下界无源汇可行流

    ZOJ 1314 Reactor Cooling | 上下界无源汇可行流 题意 有一个网络,每条边有流量的上界和下界,求一种方案,让里面的流可以循环往复地流动起来. 题解 上下界无源汇可行流的模型: ...

  5. 算法复习——无源汇可行流(zoj2314)

    题目: The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nucl ...

  6. zoj 2314 Reactor Cooling (无源汇上下界可行流)

    Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...

  7. Zoj 2314 Reactor Cooling(无源汇有上下界可行流)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意:    给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...

  8. ZOJ 2314 (sgu 194) Reactor Cooling (无源汇有上下界最大流)

    题意: 给定n个点和m条边, 每条边有流量上下限[b,c], 求是否存在一种流动方法使得每条边流量在范围内, 而且每个点的流入 = 流出 分析: 无源汇有上下界最大流模板, 记录每个点流的 in 和 ...

  9. ZOJ2314 Reactor Cooling(无源汇上下界可行流)

    The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...

随机推荐

  1. hive 学习系列之七 hive 常用数据清洗函数

    1,case when 的利用,清洗诸如评分等的内容,用例如下. case when new.comment_grade = '五星商户' then 50 when new.comment_grade ...

  2. elasticsearch搜索引擎搭建

    在该路径下,运行elasticsearch.bat该命令,后面访问127.0.0.1:9200 出现如下界面说明启动成功 elasticsearch-head操作elasticsearch的图形界面, ...

  3. python学习之对象的三大特性

    在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...

  4. C++ 指针初始化要注意的地方

    1. 声明多个指针的时候: int* P1,P2; 如上所示,声明的是创建一个指针P1和一个int型的变量P2.而不是声明的两个指针. 对每个指针变量名,都需要使用一个*. 在C++中,int* 是一 ...

  5. react-router 4.0中跳转失灵

    在https://github.com/ReactTraining/history文档中,跳转是 用这种方法,但是,用了之后就存在这么一个问题,网址换了但是页面并没有刷新. 查了资料后,history ...

  6. python2.7入门---列表(List)

        序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.Python有6个序列的内置类型,但最常见的是列表和元组. ...

  7. 【转】Git远程操作详解

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

  8. Cyclone IV器件的逻辑单元和逻辑阵列快

    1. 逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位.LE 紧密且有效的提供了高级功能的逻辑使用.每个 LE 有以下特性:一个四口输入的查找表 (LUT),以实现四种变量的任 ...

  9. Deep Learning 之 最优化方法

    Deep Learning 之 最优化方法 2017年05月21日 22:18:40 阅读数:5910 写在前面本文主要是对Deep Learning一书最优化方法的总结,具体详细的算法,另起博文展开 ...

  10. 记一次艰难的CTP调试

    一个atmel,mxt540e的CTP触摸屏. 中断配置为下降沿,输入上拉. 总是只能触发一次中断,中断脚就一直低电平,无法拉高.这只是表面现象   不停找底层I2C驱动,改代码,没用.要靠波形来说话 ...