【题意】

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

【思路】

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

上界用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. bzoj 1588 bst

    用set存下就好了. /************************************************************** Problem: 1588 User: BLADE ...

  2. jeecg3.7中DictSelect数据字典下拉选择框的用法

    1.参数 属性名                      类型        描述                                                           ...

  3. java===java基础学习(8)---静态域与静态方法

    静态域:如果将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如,加入需要给每一个雇员赋予唯一的标识码.这里给的Employee类添加一个实例域id ...

  4. sicily 4699. 简单哈希

    Description 使用线性探测法(Linear Probing)可以解决哈希中的冲突问题,其基本思想是:设哈希函数为h(key) = d, 并且假定哈希的存储结构是循环数组, 则当冲突发生时,  ...

  5. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

  6. [LabVIEW架构]ActorFramework(二)

    前言 在上一个文章中,我们介绍了一下LabVIEW中AF的基本概念,本讲将以上一次的例子来讲解LabVIEW中的实现 正文 范例说明 假定两个人,一个作为老师,一个作为学生.学生每天早上给老师发送一封 ...

  7. aspxpopupcontrol弹出在aspxpivotgrid的下方

    ASPxPopupControl是DevPress控件集中非常优秀的控件之一,适用于弹出式窗口.对话窗口.信息提示窗口等的制作,甚至可用作拖放类的图片容器. 我设计时,想点击ASPxButtonEdi ...

  8. ASP .NET CORE 部署linux 系统上的所需要的sdk 使用链接

    https://www.microsoft.com/net/learn/get-started/linuxopensuse

  9. WPS2019体验

    不久之前WPS2019发布了, 说实话, 做的真的不错. 没找到2016版本多得吓人的广告, 没有那糟糕的页面设计, 没有那卡顿的体验. 而且不同的程序(文字, 演示)做成了类似标签页的形式, 体验比 ...

  10. 安装vmware+CentOS 7.4

    安装步骤 选择第一个 按tab键 空格下一行 输入 红框内容  回车 注意事项 道路不通排查过程1.ip地址2.vmware 编辑-虚拟网络编辑器3.windows 服务 vmware相关服务 要开启 ...