滑雪场坐落在FJ省西北部的若干座山上。
从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。
由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。
 
 
  题意就是给定一张DAG,求每条边起码经过一次求覆盖所有边的最小路径条数 如图
  这时的答案为4
  很容易看出,就是在每条边都经过一次的情况下求一次最小流
  即带有下界的最小流
  解决方法很简单:
  对于一条(x,y)
  从x到y连一条容量为1,费用为-INF的边,根据最小费用最大流的性质
  我们可以看出显然这条边是会流到的
  然后鉴于每条边经过的次数不止一次,所以从x到y再连一条容量为INF,费用为0的边
  源点向所有入度为0的点连边,所有出度为0的边向汇点连边
  但是显然求最大流是求不完的,什么时候停止呢?
  每次增广必定增广出的是费用最小的一条路径
  当图中还有边未经过的时候,增光出来的路径中毕竟有费用为-INF的边
  当图中所有的边都经过的时候,增广出的路径费用为0
  这个时候就可以停止了
  
  另外事后考虑了一个问题:
  这样做为什么能保证是最小流呢?
  每次增广然后标记感觉只是模拟
  但是会发现,每条未经过的边权值为-INF,和最小费用最大流结合
  保证每次选出的路径能尽量多填满一些边
  反向弧的存在又使结果的正确性有了更多重的保证
 
program xjt7;
const maxn = ;maxm = ;INF = ;
var n,m,e,s,t,x,y:int64;
i,j:longint;
fa,next,link,w,cost,rec,son:array[-..maxm]of int64;
dis,opt,pos,pre,b,lea:array[-..maxn]of int64;
vis:array[-..maxn]of boolean; function min(a,b:int64):int64;
begin
if a<b then exit(a) else exit(b);
end; procedure add(x,y,z,cst:int64);
begin
inc(e);fa[e]:=y;next[e]:=link[x];link[x]:=e;w[e]:=z;cost[e]:=cst;rec[e]:=e+;son[e]:=x;
inc(e);fa[e]:=x;next[e]:=link[y];link[y]:=e;w[e]:=;cost[e]:=-cst;rec[e]:=e-;son[e]:=y;
end; function spfa:boolean;
var head,tail,x,j:int64;
begin
fillchar(vis,sizeof(vis),true);
fillchar(dis,sizeof(dis),);
head:=;tail:=;opt[]:=s;dis[s]:=;vis[s]:=false;
while head<>tail do
begin
head:=(head+) mod maxn;
x:=opt[head];j:=link[x];
while j<> do
begin
if (w[j]>)and(dis[x]+cost[j]<dis[fa[j]]) then
begin
dis[fa[j]]:=dis[x]+cost[j];pre[fa[j]]:=j;
if vis[fa[j]] then
begin
vis[fa[j]]:=false;
tail:=(tail+) mod maxn;
opt[tail]:=fa[j];
end;
end;
j:=next[j];
end;
vis[x]:=true;
end;
if dis[t]<>dis[t+] then exit(true);
exit(false);
end; procedure MCMF;
var sum,u,mn,ans:int64;
begin
ans:=;
while spfa do
begin
sum:=;
u:=t;mn:=INF;
while u<>s do
begin
mn:=min(mn,w[pre[u]]);
u:=son[pre[u]];
end;
u:=t;
while u<>s do
begin
inc(sum,mn*cost[pre[u]]);
dec(w[pre[u]],mn);inc(w[rec[pre[u]]],mn);
u:=son[pre[u]];
end;
if sum> then break;
inc(ans,mn);
end;
writeln(ans);
end; begin
//assign(input,'xjt7.in');reset(input);
readln(n);
fillchar(b,sizeof(b),);
for i:= to n do
begin
read(lea[i]);
for j:= to lea[i] do
begin
read(y);add(i,y,,-INF);add(i,y,INF,);
inc(b[y]);
end;
readln;
end;
s:=;t:=n+;
for i:= to n do if b[i]= then add(s,i,INF,);
for i:= to n do if lea[i]= then add(i,t,INF,);
MCMF;
end.

[BZOJ2502]清理雪道解题报告|带下界的最小流的更多相关文章

  1. UVa 1440:Inspection(带下界的最小流)***

    https://vjudge.net/problem/UVA-1440 题意:给出一个图,要求每条边都必须至少走一次,问最少需要一笔画多少次. 思路:看了好久才勉强看懂模板.良心推荐:学习地址. 看完 ...

  2. 【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] ...

  3. [BZOJ2502]清理雪道

    [BZOJ2502]清理雪道 试题描述 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定 ...

  4. BZOJ2502:清理雪道(有上下界最小流)

    Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时 ...

  5. [BZOJ2502]清理雪道 有上下界网络流(最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  6. 【上下界网络流】bzoj2502: 清理雪道

    模型:无源汇有上下界可行流 LJN:模板题吧 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的 ...

  7. [ZOJ2341]Reactor Cooling解题报告|带上下界的网络流|无源汇的可行流

    Reactor Cooling The terrorist group leaded by a well known international terrorist Ben Bladen is bul ...

  8. 洛谷4843 BZOJ2502 清理雪道

    有源汇有上下界的最小可行流. YY一下建图应该很好搞吧(? 就是对于每个雪道都是[1,inf]然后源点到所有点都是[0,inf]所有点到汇点都是[0,inf] 这样的话跑一个有源汇上下界最小可行流就可 ...

  9. BZOJ 2502 清理雪道/ Luogu P4843 清理雪道 (有源汇上下界最小流)

    题意 有一个有向无环图,求最少的路径条数覆盖所有的边 分析 有源汇上下界最小流板题,直接放代码了,不会的看dalao博客:liu_runda 有点长,讲的很好,静心看一定能看懂 CODE #inclu ...

随机推荐

  1. runtime总结 iOS

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢.我们从下面几个方面探寻Runtime的实现机制. Runtime介绍 Runtime消息传递 ...

  2. Django源码分析之server

    乍见 Django内置的server基本包括两部分:django.core.servers和django.core.handlers 相识 servers.basehttp是Django自身提供的一个 ...

  3. Leetcode 673.最长递增子序列的个数

    最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[ ...

  4. PHP Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

    最近用ThinkPHP,给公司布置线上的网站的时候,遇到的一个问题,记录一下. 打开IE浏览器的设置,Internet选项里的高级,将”显示友好的HTTP错误消息“前都勾去掉! 再次刷新,看到的错误是 ...

  5. highcharts图表插件初探

    转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...

  6. java rmi浅谈

    首先比较下RPC和RMI的差别: 首先java提供了RMI的api,jdk1.5之后虚拟机自动生成两个类:存根类stub和骨架类skelton. stub是给客户端的,当客户端调用远程对象的一个方法时 ...

  7. 使用ListOperations操作redis

    使用ListOperations对象操作redis list: 方法 c参数 s说明   List<V> range(K key, long start, long end); K key ...

  8. IP数据报格式 及分组转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本——占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度——占 4 位,可表示的最大数值 是 ...

  9. 【转】C++ const用法 尽可能使用const

    http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...

  10. 【工作感悟】——xyb项目部署

    [前言] 接手xyb项目维护有一段时间了,除了熟悉业务需求和开发环境外,还没有进行新需求的开发.前几天突然接到一个任务,要去发改委给他们部署一版最新的系统.本来事情也不大,也没有很难.但是本来是大屈. ...