【上下界网络流】bzoj2502: 清理雪道
模型:无源汇有上下界可行流
LJN:模板题吧
Description
Input
Output
题目分析
题目的限制相当于这样额外连边:对于$(u,v)$若$u$在原图上可到达$v$,那么存在一条$(v,u)$的费用为1的边。现在求使每条边至少经过一次的(流量守恒的)可行流。
这个模型就是最小费用无源汇有上下界可行流(循环流)。参考:有上下界的网络流学习笔记。
这里提供一幅简单的图供以理解。
先在原图中跑一趟最大流,将边(TT,SS)的流量作为初始答案。再在此增广的基础上,删去S,T和边(TT,SS),并以TT为超级源、SS为超级汇跑一趟最大流。答案即是初始答案减去第二次的最大流。第二次在割去(TT,SS)之后之所以还有流量,是因为TT沿着反向弧向SS方向更新了最大流量。
可以这么说:因为整张图满足流量平衡,所以TT点流入的流量=流出的流量。而TT沿着反向弧向SS方向更新的最大流量,就是SS到TT减少最多的流量。因此两者相减就是全图的最小流。
或许这个操作叫做无源汇最小流?
#include<bits/stdc++.h>
const int maxn = ;
const int maxm = ;
const int INF = 2e9; struct Edge
{
int u,v,f,c;
Edge(int a=, int b=, int c=, int d=):u(a),v(b),f(c),c(d) {}
}edges[maxm];
int n,S,T,SS,TT,ans;
int edgeTot,head[maxn],nxt[maxm],lv[maxn]; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void addedge(int u, int v, int c)
{
edges[edgeTot] = Edge(u, v, , c), nxt[edgeTot] = head[u], head[u] = edgeTot++;
edges[edgeTot] = Edge(v, u, , ), nxt[edgeTot] = head[v], head[v] = edgeTot++;
}
bool buildLevel()
{
std::queue<int> q;
memset(lv, , sizeof lv);
q.push(S), lv[S] = ;
for (int tmp; q.size();)
{
tmp = q.front(), q.pop();
for (int i=head[tmp]; i!=-; i=nxt[i])
{
int v = edges[i].v;
if (!lv[v]&&edges[i].f < edges[i].c){
lv[v] = lv[tmp]+, q.push(v);
if (v==T) return true;
}
}
}
return false;
}
int fndPath(int x, int lim)
{
if (x==T) return lim;
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i].v, val;
if (lv[x]+==lv[v]&&edges[i].f < edges[i].c){
if ((val = fndPath(v, std::min(lim, edges[i].c-edges[i].f)))){
edges[i].f += val, edges[i^].f -= val;
return val;
}else lv[v] = -;
}
}
return ;
}
int dinic()
{
int ret = , val;
while (buildLevel())
while ((val = fndPath(S, INF))) ret += val;
return ret;
}
int main()
{
memset(head, -, sizeof head);
n = read(), S = n+, T = n+, SS = n+, TT = n+;
for (int i=; i<=n; i++)
{
addedge(SS, i, INF), addedge(i, TT, INF);
for (int k=read(); k; --k)
{
int x = read();
addedge(S, x, ), addedge(i, T, );
addedge(i, x, INF);
}
}
addedge(TT, SS, INF);
dinic();
ans = -edges[edgeTot-].f;
for (int i=head[S]; i!=-; i=nxt[i]) edges[i].c = edges[i^].c = edges[i].f = edges[i^].f = ;
for (int i=head[T]; i!=-; i=nxt[i]) edges[i].c = edges[i^].c = edges[i].f = edges[i^].f = ;
edges[edgeTot-].f = edges[edgeTot-].f = edges[edgeTot-].c = edges[edgeTot-].c = ;
S = TT, T = SS;
ans -= dinic();
printf("%d\n",ans);
return ;
}
END
【上下界网络流】bzoj2502: 清理雪道的更多相关文章
- [BZOJ2502]清理雪道 有上下界网络流(最小流)
2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...
- [BZOJ2502]清理雪道
[BZOJ2502]清理雪道 试题描述 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定 ...
- hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )
题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- POJ 2396 Budget(有源汇上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...
- HDU 4940 Destroy Transportation system(无源汇上下界网络流)
Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)
"Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...
- uoj132/BZOJ4200/洛谷P2304 [Noi2015]小园丁与老司机 【dp + 带上下界网络流】
题目链接 uoj132 题解 真是一道大码题,,,肝了一个上午 老司机的部分是一个\(dp\),观察点是按\(y\)分层的,而且按每层点的上限来看可以使用\(O(nd)\)的\(dp\),其中\(d\ ...
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
[算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...
随机推荐
- Java程序的运行机制和JVM
1. Java语言比较特殊, 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件).这种字节码不是可执行性的,必须使用 ...
- php:判断 是否开启 SSL,CURL,ZIP,GD2,MYSQL,是否安装MEMCACHED
对于php的开发环境,通常需要去先判断下一些扩展和服务时不时已经可用~ 看过的欢迎拍砖,给意见~~ <?php /** * 判断 是否开启 SSL,CURL,ZIP,GD2,MYSQL,是否安装 ...
- 042 Trapping Rain Water 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算下雨之后能接多少雨水.例如,输入 [0,1,0,2,1,0,1,3,2,1,2,1],返回 6. 详见:https://leetcode.c ...
- 关于Nginx对于PHP支持的问题
因为使用的mediawiki是用php写的,所以就遇上了一个问题,怎么让Nginx支持php,记得当时使用apache2的时候是安装了一个叫 “ libapache2-mod-php5 ”的mod , ...
- (转)Linxu磁盘体系知识介绍及磁盘介绍
Linxu磁盘体系知识介绍及磁盘介绍 系统管理 / 2017-01-14 / 0 条评论 / 浴春风 Linu磁盘设备基础知识指南磁盘速度快具备的条件: 1)主轴的转速5400/7200/10000/ ...
- meta标签的一些用法
meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <head> <meta http-equiv="conten ...
- A. Arya and Bran
A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 下一代的前端构建工具:parcel打包react
1. parcel很受欢迎,webpack太慢了,试试Parcel下一代的前端构建工具 2.Parcel很快,但缺少好多插件,没有base64,没有办法拆分打包文件.... 3.总结:适合小项目 4. ...
- java的三大特性之一继承概述
0.继承-----注意事项 00.子类最多只能继承一个父类(指直接继承) 01.java所有的类都是Object的子类 02.JPK6.0中有202个包3777个类,接口,异常,枚举,注释和错误 03 ...
- linux命令行—《命令行快速入门》
pwd print working directory 打印工作目录 hostname my computer's network name 电脑在网络中的名称 mkdir make director ...