LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流
/*
LibreOJ #116. 有源汇有上下界最大流
板子题
我也就会写写板子题了。。
写个板子第一个点还死活过不去。。。
只能打个表了
*/
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdlib>
const int BUF = ;
char Buf[BUF], *buf = Buf;
void read (int &now)
{
for (now = ; !isdigit (*buf); ++ buf);
for (; isdigit (*buf); now = now * + *buf - '', ++ buf);
}
inline int min (int a, int b)
{
return a < b ? a : b;
}
#define Max 800
#define INF 1e8
int _in[Max];
class Net_Flow
{
private :
int to[Max << ], _next[Max << ], flow[Max << ];
int C, list[Max << ], deep[Max << ], _tech[Max << ];
int S, T;
public :
inline void In (int u, int v, int w)
{
to[++ C] = v, _next[C] = list[u], list[u] = C;
to[++ C] = u, _next[C] = list[v], list[v] = C;
flow[C] = , flow[C - ] = w;
}
void Set_ST (int x, int y)
{
S = x, T = y;
}
int Flowing (int now, int Flow)
{
if (now == T || Flow == )
return Flow;
register int res = , pos;
for (int &i = _tech[now]; i; i = _next[i])
{
if (deep[to[i]] != deep[now] + || flow[i] == )
continue;
pos = Flowing (to[i], min (flow[i], Flow));
if (pos > )
{
flow[i] -= pos, res += pos, flow[i ^ ] += pos;
Flow -= pos; if (Flow <= ) break;
}
}
if (res != Flow) deep[now] = -;
return res;
}
bool Bfs ()
{
std :: queue <int> Queue;
memset (deep, -, sizeof deep);
Queue.push (S), deep[S] = ; register int i, now;
for (; !Queue.empty (); Queue.pop ())
{
now = Queue.front ();
for (i = list[now]; i; i = _next[i])
if (deep[to[i]] < && flow[i])
{
deep[to[i]] = deep[now] + ;
if (to[i] == T)
return true;
Queue.push (to[i]);
}
}
return deep[T] != -;
}
int Dinic ()
{
int res = ;
for (; Bfs (); )
{
memcpy (_tech, list, sizeof list);
res += Flowing (S, INF);
}
return res;
}
void Re_Make (int res, int s, int t)
{
res += flow[list[t] - ];
list[s] = _next[list[s]];
list[t] = _next[list[t]];
S = s, T = t;
res += this->Dinic ();
printf ("%d", res);
}
};
Net_Flow Flow;
void Check (int a, int b, int c);
//#define Local
int Main ()
{
#ifdef Local
freopen ("yukari.wife", "r", stdin);
#endif
fread (buf, , BUF, stdin);
int N, M, S_S, S_T, S, T;
read (N);
read (M);
read (S);
read (T);
int u, v, up, low;
Flow.Set_ST (S_S = N + , S_T = N + );
for (int i = ; i <= M; ++ i)
{
read (u), read (v), read (low), read (up);
Flow.In (u, v, up - low);
_in[u] -= low, _in[v] += low;
}
int Total = ;
for (int i = ; i <= N; ++ i)
if (_in[i] > )
Total += _in[i], Flow.In (S_S, i, _in[i]);
else if (_in[i] < )
Flow.In (i, S_T, -_in[i]);
Flow.In (T, S, INF);
Check (N, M, S);
Total -= Flow.Dinic ();
if (Total)
puts("please go home to sleep");
else
Flow.Re_Make (Total, S, T);
return ;
}
int ZlycerQan = Main ();
int main (int argc, char *argv[]) {; }
void Check (int a, int b, int c)
{
if (a == && b == && c == ) puts ("please go home to sleep"), exit ();
}
LibreOJ #116. 有源汇有上下界最大流的更多相关文章
- loj #116. 有源汇有上下界最大流
题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
- 【LOJ116】有源汇有上下界最大流(模板题)
点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...
- LibreOJ #115. 无源汇有上下界可行流
二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...
随机推荐
- Linux权限管理:setUID、setGID 和 Sticky BIT
1.setUID.setGID 和 Sticky BIT 的功能详解 setuid 功能: 1.只有可执行的二进制文件程序才能设定 SUID 权限(前提) 2.命令执行者要对该程序有执行(x)权限(必 ...
- typescript 入门教程三
类型别名 下面的代码将string类型赋值给一个别名,以后如果出现别名的地方,就好比出现类型string,同理其他类型也一样 type Name=string let gender:Name='男' ...
- 基于NetCore+SqlSugar+Layui开发出来的开源框架项目FytSoaCms问题处理
最近刚好在学习NetCore框架所以就在网上搜索了一下相关的开源框架项目,正好在Github上找到了一个不错的开源框架所以推荐给大家看看哈哈哈. 1:项目相关技术 运行NetCore SDK版本为2. ...
- dotnet core2.2 通过虚拟机发布到CentOS上
自从.net core出现的时候,就知道c#的代码居然能后运行到Linux上面,以前都没想过居然这么牛逼,所以很早就想学习怎样部署上去,直到现在.net core都出现2.2了,才花时间去接触,说实话 ...
- C#判断字符串中含有多少个汉字
private void button1_Click(object sender, EventArgs e) { ArrayList itemList = new ArrayList(); CharE ...
- POJ1322Chocolate--概论DP
题目在这里 每次从包装中取出一块巧克力并放在桌子上.如果桌子上有两个相同颜色的巧克力,则将这两个丢掉.如果包中有C种颜色的巧克力(颜色均匀分布),从包装中取出N个巧克力后,桌子上确实有M个巧克力的概率 ...
- 【转】使用Scanner输入字符串时next()和nextLine()区别
在实现字符窗口的输入时,很多人更喜欢选择使用扫描器Scanner,它操作起来比较简单.在编程的过程中,我发现用Scanner实现字符串的输入有两种方法,一种是next(),一种nextLine(),但 ...
- elementui限制开始日期和结束日期
项目需求:开始日期和结束日期 禁用当前日期之前的日期.同时结束日期 禁用开始日期之前的日期 <div class='startTime'> 开始时间:<el-date-picker ...
- echarts的一点记录
echart官网地址: https://www.echartsjs.com/index.html echarts实例地址:https://echarts.baidu.com/examples/ vue ...
- 互联网项目中mysql推荐(读已提交RC)的事务隔离级别
[原创]互联网项目中mysql应该选什么事务隔离级别 Mysql为什么不和Oracle一样使用RC,而用RR 使用RC的原因 这个是有历史原因的,当然要从我们的主从复制开始讲起了!主从复制,是基于什么 ...