loj #116. 有源汇有上下界最大流
有源汇有上下界最大流,->上下界网络流
注意细节,重置cur和dis数组时,有n+2个点
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<iostream>
- using namespace std;
- const int N = ;
- const int INF = 1e9;
- struct Edge {
- int to,nxt,c;
- }e[];
- int head[N],dis[N],cur[N],M[N];
- int q[],L,R;
- int n,m,S,T,tot = ,Sum;
- inline char nc() {
- static char buf[],*p1 = buf,*p2 = buf;
- return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
- }
- inline int read() {
- int x = ,f = ;char ch = nc();
- for (; ch<''||ch>''; ch=nc()) if(ch=='-') f=-;
- for (; ch>=''&&ch<=''; ch=nc()) x=x*+ch-'';
- return x * f;
- }
- void add_edge(int u,int v,int c) {
- e[++tot].to = v,e[tot].c = c,e[tot].nxt = head[u],head[u] = tot;
- }
- bool bfs() {
- for (int i=; i<=n+; ++i) // n+2
- cur[i] = head[i],dis[i] = -;
- L = ,R = ;
- q[++R] = S;
- dis[S] = ;
- while (L <= R) {
- int u = q[L++];
- for (int i=head[u]; i; i=e[i].nxt) {
- int v = e[i].to;
- if (dis[v] == - && e[i].c > ) {
- dis[v] = dis[u] + ;
- q[++R] = v;
- if (v == T) return true;
- }
- }
- }
- return false;
- }
- int dfs(int u,int flow) {
- if (u == T) return flow;
- int used = ;
- for (int &i=cur[u]; i; i=e[i].nxt) {
- int v = e[i].to;
- if (dis[v] == dis[u] + && e[i].c > ) {
- int tmp = dfs(v,min(e[i].c,flow-used));
- if (tmp > ) {
- e[i].c -= tmp;e[i^].c += tmp;
- used += tmp;
- if (used == flow) break;
- }
- }
- }
- if (used != flow) dis[u] = -;
- return used;
- }
- int dinic(int s,int t) {
- S = s,T = t;
- int ans = ;
- while (bfs()) ans += dfs(S,INF);
- return ans;
- }
- int main () {
- freopen("1.txt","r",stdin);
- n = read(),m = read();
- int s = read(),t = read();
- int ss = n+,tt = n+;
- for (int i=; i<=m; ++i) {
- int u = read(),v = read(),b = read(),c = read();
- add_edge(u,v,c-b);
- add_edge(v,u,);
- M[u] -= b;M[v] += b;
- }
- for (int i=; i<=n; ++i) {
- if (M[i] > ) add_edge(ss,i,M[i]),add_edge(i,ss,),Sum += M[i];
- if (M[i] < ) add_edge(i,tt,-M[i]),add_edge(tt,i,);
- }
- add_edge(t,s,INF);
- add_edge(s,t,);
- if (dinic(ss,tt) != Sum) {
- puts("please go home to sleep");
- return ;
- }
- int ans = e[tot].c;
- e[tot].c = ;e[tot ^ ].c = ;
- ans += dinic(s,t);
- printf("%d\n",ans);
- return ;
- }
loj #116. 有源汇有上下界最大流的更多相关文章
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...
- LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- Loj#116-[模板]有源汇有上下界最大流
正题 题目链接:https://loj.ac/p/116 题目大意 \(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源 ...
- 2018.08.20 loj#117. 有源汇有上下界最小流(模板)
传送门 这题真有意思... 先是有一个点T的我怀疑人生. 然后学大佬们封装了我的dinic就莫名其妙的过了??? 所以说锅给谁好呢? 给dinic吧... 解法就是先求出一段可行流,然后从t到s加一条 ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
随机推荐
- linux awk 内置函数实例
awk内置函数,主要分4种:算数函数.字符串函数.时间函数.一般函数 一.算术函数 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y, x ) 返回 y/x ...
- sqli-labs less 5-6
sqli-labs less 5-6 从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,以前的union联合查询就不能用了,开始尝试盲注. 简单 ...
- Linux下IP SAN共享存储操作记录
一.简单介绍SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输.常见的分类是FC-SAN和IP- ...
- Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)
自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...
- restfull环境搭建-helloword(三)
原文地址:http://only81.iteye.com/blog/1689537 This section creates a CRUD (Create, Read, Update, Delete) ...
- vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释
本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...
- Python-str-操作-6
#字符串的索引与切片 s = 'ABCDLSESRF' #索引 s1 = s[0] print(s1) s2 = s[2] print(s2) s3 = s[-1] print(s3) s4 = s[ ...
- react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析
在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...
- JavaScript术语:shim 和 polyfill
转自:https://www.html.cn/archives/8339 在学习和使用 JavaScript 的时候,我们会经常碰到两个术语:shim 和 polyfill.它们有许多定义和解释,意思 ...
- 作业20171102 beta1 成绩
申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月12日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...