一开始看是插头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的更多相关文章

  1. 【BZOJ2595】游览计划(状压DP,斯坦纳树)

    题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...

  2. BZOJ2595 WC2008游览计划(斯坦纳树)

    斯坦纳树板子题. 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案. 转移时首先枚举子集,有f[i][j][S]=min{f[i][j ...

  3. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

  4. 【BZOJ2595】[Wc2008]游览计划 斯坦纳树

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

  5. BZOJ2595 [Wc2008]游览计划 【状压dp + 最短路】

    题目链接 BZOJ2595 题解 著名的斯坦纳树问题 设\(f[i][j][s]\)表示点\((i,j)\)与景点联通状况为\(s\)的最小志愿者数 设\(val[i][j]\)为\((i,j)\)需 ...

  6. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  7. [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树

    游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...

  8. bzoj2595 [Wc2008]游览计划——斯坦纳树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.c ...

  9. BZOJ2595[WC2008]游览计划

    Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数 ...

随机推荐

  1. RHEL 7.2 安装Oracle XE-11.2.0

    轻量快捷版本,适合开发 0. /etc/hosts 添加 本机hostname # hostnamepromote.cache-dns.local # cat /etc/hosts127.0.0.1 ...

  2. 百度地图api的实现

    获取客户端IP地址经纬度所在城市 <?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo ''; $con ...

  3. jQuery基础与实例

    一.简介 1.什么是jQuery jQuery是一个轻量级.快速简洁的javaScript库,能让我们方便快捷的选择元素操作元素属性. 2.下载地址 3.jQuery使用方式 $("div& ...

  4. linux crontab 命令

    Linux 系统提供了使用者控制计划任务的命令 :crontab 命令. 一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划 ...

  5. 彻底卸载网易UU网游加速器的方法

    昨天跟朋友一起玩游戏,网速感觉不怎么好就下了一个免费的网易UU加速器来给对战平台加速,结果加速了以后网速更差,我晕,于是想卸载,可这个加速器口只有一个exe文件,不用安装,但在第一次加速时记得安装了一 ...

  6. 【BZOJ 1084】[SCOI2005]最大子矩阵

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  7. 微软职位内部推荐-SENIOR PRODUCER

    微软近期Open的职位: Role Based in Shanghai, ChinaTitle: ProducerWe are seeking a Senior Producer to lead Pr ...

  8. MySQL与Oracle主键Query性能测试结果

    测试结果总结如下: 1. 按主键读:SQL形式:SELECT * FROM table WHERE id=?. 1.1. 主键为数字.如果所有ID均不存在,纯比较SQL解析能力.MySQL解析SQL的 ...

  9. IOS项目集成ShareSDK实现第三方登录、分享、关注等功能(备用)

    (1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...

  10. java程序练习:数组中随机10个数中的最大值

    //定义输入:其实是一个可以保存10个整数的数组 //使用循环遍历,生成10个随机数,放入每个元素中//打桩,数组中的内容 //定义输出变量 //将数组中第一个元素取出,保存在max中,当靶子 //遍 ...