bzoj2595
一开始看是插头dp,后来发现还有一个叫斯坦纳树的东西
什么叫斯坦纳树,就是使给定点连通开销和最小的树(可以包含多余的点)
到这张平面图上,我们不难想到用dp来解决,设f[x,y,S]表示连通集合为S,树根为点(x,y)的最小开销
不难得到两个方程式
f[x,y,S]=min(f[x,y,s']+f[x,y,S-s']-a[x,y]) S'是S的一个子集,相当于合并两个数
f[x,y,S]=min(f[x',y',S]+a[x,y]) (x',y')与(x,y)相邻
由于景点很少,我们显然可以用状压dp,初始f[景点坐标,景点状态]=0
第一个方程转移大家都会,第二个方程转移是没有明确转移顺序,只要转移起点,因此我们用spfa转移
所以总的处理转移,我们穷举连通状况,然后先用第一个方程转移,然后再用第二个方程转移
const dx:array[..] of longint=(,,,-);
dy:array[..] of longint=(,-,,);
inf=;
type node=record
x,y,k:longint;
end; var q:array[..] of node;
pre:array[..,..,..] of node;
f:array[..,..,..] of longint;
v:array[..,..] of boolean;
a:array[..,..] of longint;
t,h,r,k,i,j,s,n,m,x,y:longint; function make(i,j,k:longint):node;
begin
make.x:=i;
make.y:=j;
make.k:=k;
end; procedure spfa(k:longint);
var i,x,y,x0,y0:longint;
begin
while h<=r do
begin
x0:=q[h].x; y0:=q[h].y;
v[x0,y0]:=false;
for i:= to do
begin
x:=x0+dx[i];
y:=y0+dy[i];
if (x<) or (x>n) or (y<) or (y>m) then continue;
if f[x,y,k]>f[x0,y0,k]+a[x,y] then
begin
f[x,y,k]:=f[x0,y0,k]+a[x,y];
pre[x,y,k]:=make(x0,y0,k);
if not v[x,y] then
begin
v[x,y]:=true;
inc(r);
q[r].x:=x; q[r].y:=y;
end;
end;
end;
inc(h);
end;
end; procedure dfs(x,y,k:longint);
var m:node;
begin
v[x,y]:=true;
m:=pre[x,y,k];
if m.x= then exit;
dfs(m.x,m.y,m.k);
if (m.x=x) and (m.y=y) then dfs(m.x,m.y,k-m.k);
end; begin
readln(n,m);
for i:= to n do
for j:= to m do
for k:= to do
f[i,j,k]:=inf;
for i:= to n do
for j:= to m do
begin
read(a[i,j]);
if a[i,j]= then
begin
f[i,j, shl t]:=;
inc(t);
end;
end;
h:=;
r:=;
for k:= to shl t- do
begin
for i:= to n do
for j:= to m do
begin
s:=k and (k-);
while s<> do //穷举子集
begin
if f[i,j,k]>f[i,j,s]+f[i,j,k-s]-a[i,j] then
begin
f[i,j,k]:=f[i,j,s]+f[i,j,k-s]-a[i,j];
pre[i,j,k]:=make(i,j,s); //记录从哪转移来的
end;
s:=k and (s-);
end;
if f[i,j,k]<inf then
begin
v[i,j]:=true;
inc(r);
q[r].x:=i; q[r].y:=j;
end;
end;
spfa(k);
h:=;
r:=;
end;
for i:= to n do
for j:= to m do
if a[i,j]= then
begin
x:=i;
y:=j;
break;
end; writeln(f[x,y, shl t-]);
dfs(x,y, shl t-);
for i:= to n do
begin
for j:= to m do
if a[i,j]= then write('x')
else if v[i,j] then write('o')
else write('_');
writeln;
end;
end.
bzoj2595的更多相关文章
- 【BZOJ2595】游览计划(状压DP,斯坦纳树)
题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...
- BZOJ2595 WC2008游览计划(斯坦纳树)
斯坦纳树板子题. 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案. 转移时首先枚举子集,有f[i][j][S]=min{f[i][j ...
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- BZOJ2595 [Wc2008]游览计划 【状压dp + 最短路】
题目链接 BZOJ2595 题解 著名的斯坦纳树问题 设\(f[i][j][s]\)表示点\((i,j)\)与景点联通状况为\(s\)的最小志愿者数 设\(val[i][j]\)为\((i,j)\)需 ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- bzoj2595 [Wc2008]游览计划——斯坦纳树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.c ...
- BZOJ2595[WC2008]游览计划
Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数 ...
随机推荐
- const和#define的区别
在刷题的时候经常遇到定义全局常量我一般都是用#define(可能是因为很少接触const的原因) 在昨天做到51nod1082时照常暴力用#define定义最大.可是提交超时..... 后来看他人写的 ...
- WPF-实现Windows 7 样式 Aero TreeView 控件
关于实现Windows 7 样式 Aero TreeView 控件的具体过程可以参考如下文章 http://www.cnblogs.com/o2ds/archive/2010/06/22/176302 ...
- Sambar,实现Linux和Windows共享
我下载的是tar的jar包,不是rpm,rpm就不多说了.目的是让Windows能够共享Linux系统的文件夹 1.进入到source文件夹: 2../configure->make->m ...
- 过滤菜鸟的iOS面试题-b
网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...
- linux mint 五笔安装方法
终于可以使用五笔了,方法就是安装好ibus后要设置首选项,这样在首选项里设置就可以了.
- Nhibernate 一对一关系映射(主键映射)
参考:点击这里 妈的,搞了一天了,终于可以了,现在总结下,以防下次再出现这样痛苦的问题了,有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个 ...
- Ext.Ajax.request()方法和FormPanel.getForm().submit()方法,都返回success()方法的差异
我还是不发表到博客园首页吧,要不然还是要被取消,>_< 还是言归正传吧,关于Ext.Ajax.request()方法和FormPanel.getForm().submit()方法返回suc ...
- [转载]MongoDB查询优化原则
.在查询条件.排序条件.统计条件的字段上选择创建索引,可以显著提高查询效率. .用$or时把匹配最 多 结果的条件放在最前面,用$and时把匹配最 少 结果的条件放在最前面. .使用limit()限定 ...
- 团体程序设计天梯赛-练习集L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- List<T> 排序
List<T>的排序 List<DataPoint> dataPointsDataPints = ...; //按RegisterAddress升序排序 dataPointsD ...