【题意】

给出一些边流量的上界和下界,问能否循环流通。

【思路】

黄学长讲得很清楚,直接贴过来:

上界用ci表示,下界用bi表示。

下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi。

主要思想:每一个点流进来的流=流出去的流

对于每一个点i,令

Mi= sum(i点所有流进来的下界流)– sum(i点所有流出去的下界流)

*PO主注:下界流指的就是输入的下界

如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。

如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。

如果求S->T的最大流,看是否满流(S的相邻边都流满)。

满流则有解,否则无解。

【错误点】

忘记清空vector和in数组了orz

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define target n+1
using namespace std;
const int MAXM=+;
const int MAXN=+;
const int INF=0x7fffffff;
struct node
{
int to,pos,cap;
};
vector<node> E[MAXM];
int n,m,sum=;
int in[MAXN];
int dist[MAXN];
int low[MAXM];//记录下每条边的下界
int edge[MAXM][]; void addedge(int u,int v,int c)
{
E[u].push_back((node){v,E[v].size(),c});
E[v].push_back((node){u,E[u].size()-,});
} void init()
{
memset(in,,sizeof(in));//不要忘记了要清空in
for (int i=;i<target;i++) E[i].clear();//不要忘记了要清空vector
int u,v,c;
for (int i=;i<m;i++)
{
scanf("%d%d%d%d",&u,&v,&low[i],&c);
in[u]-=low[i];
in[v]+=low[i];
addedge(u,v,c-low[i]);
edge[i][]=v;
edge[i][]=E[v].size()-;
}
sum=;
for (int i=;i<=n;i++)
{
if (in[i]>)
{
addedge(,i,in[i]);
sum+=in[i];
}
else if (in[i]<) addedge(i,target,-in[i]);
}
} int bfs()
{
memset(dist,-,sizeof(dist));
queue<int> que;
while (!que.empty()) que.pop();
que.push();
dist[]=; while (!que.empty())
{
int head=que.front();
que.pop();
for (int i=; i<E[head].size(); i++)
{
node &tmp=E[head][i];
if (dist[tmp.to]==- && tmp.cap>)
{
dist[tmp.to]=dist[head]+;
que.push(tmp.to);
if (tmp.to==target) return ;
}
}
}
return ;
} int dfs(int s,int e,int maxflow)
{
int ret=;
if (s==e || maxflow==) return maxflow;
for (int i=;i<E[s].size();i++)
{
node &tmp=E[s][i];
if (dist[tmp.to]==dist[s]+ && tmp.cap>)
{
int delta=dfs(tmp.to,e,min(maxflow,tmp.cap));
if (delta>)
{
ret+=delta;
tmp.cap-=delta;
E[tmp.to][tmp.pos].cap+=delta;
maxflow-=delta;
}
}
}
return ret;
} void dinic()
{
int flow=;
while (bfs())
{
int f=dfs(,target,INF);
if (f>)
flow+=f;
else break;
}
if (flow!=sum) cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for (int i=;i<m;i++) cout<<low[i]+E[edge[i][]][edge[i][]].cap<<endl;
}
} int main()
{
while (~(scanf("%d%d",&n,&m)))
{
init();
dinic();
}
return ;
}

【无源汇有上下界可行流】ACdream1211-Reactor Cooling的更多相关文章

  1. LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)

    #115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...

  2. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  3. [loj#115] 无源汇有上下界可行流 网络流

    #115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题 ...

  4. loj#115. 无源汇有上下界可行流

    \(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...

  5. 【LOJ115】无源汇有上下界可行流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你判断是否存在可行流.若有,则还需输出一个合法方案. 大致思路 首先,每条边既然有一个流量下界\(lower\),我们就强制它初始流量为\(lower ...

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

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

  7. LibreOJ #115. 无源汇有上下界可行流

    二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...

  8. 无源汇有上下界可行流(ZQU 1590)

    无源汇有上下界可行流(也就是循环流) 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi, 每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终) ...

  9. 【模板】无源汇有上下界可行流(网络流)/ZOJ2314

    先导知识 网络最大流 题目链接 https://vjudge.net/problem/ZOJ-2314 题目大意 多组数据,第一行为数据组数 \(T\). 对于每一组数据,第一行为 \(n,m\) 表 ...

随机推荐

  1. postman测试express restful接口

    安装express及postman var express = require('express') var app = express(); var calculation = require('. ...

  2. Python3 xml模块的增删改查

    xml数据示例 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <data>     < ...

  3. 【学习笔记】动态树Link-Cut-Tree

    这是两个月前写的,看能不能搬运过来…… 动态树是一类维护森林连通性的问题(已纠正,感谢ZQC巨佬),目前最(wo)常(zhi)见(hui)的动态树就是LCT(Link-Cut-Tree),然而LCT似 ...

  4. 如何设置static tableview的section区域高度

    重写代理方法- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { i ...

  5. mysql远程访问cannot connect(10038) 问题解决的过程

    今天用Navicat访问虚拟机上的mysql,无法访问报cannot connect(10038). 首先看是否可以telnet,本机cmd,telnet 192.168.209.128 3306,结 ...

  6. 深度学习方法:受限玻尔兹曼机RBM(四)对比散度contrastive divergence,CD

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 上篇讲到,如果用Gibbs Sa ...

  7. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. Redis安装+密码认证

    redis: 安装: $ wget http://download.redis.io/releases/redis-3.2.7.tar.gz $ tar xzf redis-3.2.7.tar.gz ...

  9. Java 类、属性、方法修饰符 public、private、protected、default

    Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...

  10. 前端读者 | 百度前端编码规范(JS)

    本文来自:百度FEX 1 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对J ...