bzoj2324
出题人真 口袋迷
很容易发现这是一道费用流的题目
很显然这个问题有两个难点:
保证走到某个点时之前序号的点都被走过
保证每个点都走
对于1,我们换个说法,一个人走到该点时经过的点的序号都小于该点----->3
只要满足了2和3,就一定满足1
现在来看3,也就是说两个点之间的最短路i,j,必须由k(k<j) 来更新
很像是floyd,事实上我们只要改一改floyd就能满足3
下面的问题就是,怎么满足2,也就是称之为有下界的网络流
这里学习了一个非常厉害的方法解决此类问题:
加无穷小边连接汇点
对于这道题,我们把除了0号点的以外点拆成两个点,之间连两条边
一条流量为1,费用为负无穷;一条流量为无穷,费用为0
什么意思呢?第二条边好理解,表示每个点都可以被经过无数次
第一条边什么意思呢?保证每个点都被走过;
因为这条边的费用为极小边,根据费用流的算法,这条边一定会被走过,等价于这个点一定会被走过;
最后计算总费用的时候我们再把负费用弄掉即可
后记:
话说,我在省选的前几天做了这道题目,说了都是泪啊;
考试的时候D2 T1同样也是有下界的网络流,比这题还简单,
这不过是边的容量下界是1,(一样的道理,在每条边的基础上加一条流为1,费用为这条边的费用-极小量即可)
我也很好的写出了处理有下界的网络流的方法;
可我偏偏脑抽的用到了邻接矩阵,这样就毫无意外的被重边卡死了T T
自作孽,不可活…………
UPD:注意这个程序虽然能过但有点问题,具体见后续
const inf=;
bi=;
type node=record
from,point,cost,flow,next:longint;
end; var edge:array[..] of node;
q:array[..] of longint;
a:array[..,..] of longint;
p,pre,d:array[..] of longint;
v:array[..] of boolean;
len,x,y,z,ans,n,m,k,i,j,w,t:longint; procedure add(x,y,f,w:longint);
begin
inc(len);
edge[len].from:=x;
edge[len].point:=y;
edge[len].flow:=f;
edge[len].cost:=w;
edge[len].next:=p[x];
p[x]:=len;
end; function spfa:boolean; //网络流基本模板
var i,f,r,x,y:longint;
begin
fillchar(v,sizeof(v),false);
for i:= to t do
d[i]:=inf;
d[]:=;
f:=;
r:=;
q[]:=;
v[]:=true;
while f<=r do
begin
x:=q[f];
v[x]:=false;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if edge[i].flow> then
begin
if d[y]>d[x]+edge[i].cost then
begin
d[y]:=d[x]+edge[i].cost;
pre[y]:=i;
if not v[y] then
begin
v[y]:=true;
inc(r);
q[r]:=y;
end;
end;
end;
i:=edge[i].next;
end;
inc(f);
end;
if d[t]=inf then exit(false) else exit(true);
end; procedure mincost; //费用流
var i,j:longint;
begin
while spfa do
begin
i:=t;
while i<> do
begin
j:=pre[i];
dec(edge[j].flow); //每次只会流一个人
inc(edge[j xor ].flow);
i:=edge[j].from;
end;
ans:=ans+d[t];
end;
end; begin
readln(n,m,w);
inc(n);
len:=-;
fillchar(p,sizeof(p),);
for i:= to n do
begin
for j:= to n do
a[i,j]:=inf;
a[i,i]:=;
end;
t:=*n+;
for i:= to m do
begin
readln(x,y,z);
inc(x); //仅仅是为了方便
inc(y);
if a[x,y]>z then
begin
a[x,y]:=z;
a[y,x]:=z;
end;
end;
add(,,w,); //一共有w个人,自然流量为w
add(,,,);
for i:= to n do
begin
add(i,i+n,,-bi); //处理下界网络流简单快捷的方法
add(i+n,i,,bi);
add(i+n,t,,); //每个人都可以停在当前点不走,流直接流出
add(t,n+i,,);
end;
for k:= to n do
begin
for i:= to n do
if i<>k then
for j:= to n do
if (i<>j) and (j<>k) then
a[i,j]:=min(a[i,j],a[i,k]+a[k,j]);
if k<> then
begin
add(,k,,a[,k]);
add(k,,,-a[,k]);
end;
for i:= to k- do // 边做边建图,显然这时候,i到k的最短路径一定是由编号小于k的点更新来的
begin
add(i+n,k,,a[i,k]); //这个地方和上面流量为什么是1呢?点i到下一个点j可行最小路径只要走一次,
如果这条路径实际需要走多次的话,那必然有点i到点k的可行最短路径由ij可行最短路更新的来
于是下一次找增广路的时候,我们直接走ik之间最短路即可
所以这里我们把每条路径流量限制为1,这样寻找增广路的速度会更快
(当然像考试时拿不准还是写成inf吧
add(k,i+n,,-a[i,k]);
end;
end;
mincost;
writeln(ans+(n-)*bi); //修正ans
end.
bzoj2324的更多相关文章
- bzoj2324后续思考
昨天写bzoj2324的解题报告的时候突然隐隐约约发现了我程序的一点问题 睡了一觉之后找到了反例 如下: 4 4 2 0 1 2 1 2 1 2 3 2 2 4 2 对于这个测试数据,显然最短路径和为 ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...
- BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)
虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的.那么在摧毁据点x的过程中,其只能经过编号小于x的点.并且这样一定合法,因为可以控制其他人先去摧毁所经过的点.那 ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流
[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...
- BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...
- bzoj2324营救皮卡丘
费用流. 建图比较重要. 1.S->id[0][0] flow=k. 表示k条路径. 2.S->id[i][0] flow=1, 每次消耗1流量就补充1流量. 3.id[i][1]-> ...
- BZOJ2324: [ZJOI2011]营救皮卡丘
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1359 Solved: 522[Submit][Stat ...
- [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘
[Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...
- 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
随机推荐
- JavaScript技巧45招
原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...
- shell调用sqlplus批量执行sql文件
在最近的工作中,经常需要批量执行一些DML, DDL, PL/SQL语句或导入一些Function, Procedure.因为support的国家比较多,常常需要一个登陆到一个国家的数据库上执行完成后 ...
- spot 5、ALOS监督分类波段组成
spot 5监督分类RGB:412 ALOS分类波段RGB:432
- To change the sharepoint CA port
Set-SPCentralAdministration -Port <port number> to fix the error: Got this error: Failed to re ...
- WinForm 换行问题 textbox (转)
WinForm 换行问题 textbox 今天碰到一段string在label中能正常换行,但是在textbox中却无法换行的问题. 首先考虑是换行符的问题.在网上查了些资料: 1.TextBox 中 ...
- 团体程序设计天梯赛-练习集L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- 在smarty模板中嵌入php代码
我个人并不太喜欢smarty的语法,写起来比较啰嗦易出现匹配出错,但是旧项目中有许多工程都是采用它作模板.最近需要在此上稍微加一些PHP的内容,但我不想在模板控制层去一个一个assign,而想在模板文 ...
- Nagios Apache报Internal Server Error错误的解决方法
今天配置Nagios的时候遇到了一些麻烦,前面的步骤都一切顺利,nagios运行后,可以看到nagios的主页,但点击左边的菜单时总是提示Internal Server Error错误.错误如下: v ...
- VS2008调试技巧收集备用
VS2005调试技巧集合 http://blog.csdn.net/rainylin/archive/2007/09/06/1775125.aspx 下面有从浅入深的6个问题,您可以尝试回答一下 一个 ...
- FZU-1921+线段树
简单的线段树. 记录MinVal 和 相应的ID即可 /* 线段树 */ #include<stdio.h> #include<string.h> #include<st ...