Description

Input

第一行有两个整数,N和 M,描述方块的数目。 
接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点;
否则表示控制该方块至少需要的志愿者数目。 相邻的整数用 (若干个) 空格隔开,
行首行末也可能有多余的空格。

Output

由 N + 1行组成。第一行为一个整数,表示你所给出的方案
中安排的志愿者总数目。 
接下来 N行,每行M 个字符,描述方案中相应方块的情况: 
z  ‘_’(下划线)表示该方块没有安排志愿者; 
z  ‘o’(小写英文字母o)表示该方块安排了志愿者; 
z  ‘x’(小写英文字母x)表示该方块是一个景点; 
注:请注意输出格式要求,如果缺少某一行或者某一行的字符数目和要求不
一致(任何一行中,多余的空格都不允许出现) ,都可能导致该测试点不得分。

Sample Input

4 4
0 1 1 0
2 5 5 1
1 5 5 1
0 1 1 0

Sample Output

6
xoox
___o
___o
xoox

HINT

对于100%的数据,N,M,K≤10,其中K为景点的数目。输入的所有整数均在[0,2^16]的范围内

题解:

裸裸的斯坦纳树,只是多了要求具体方案。

将需要联通的景点是否在联通块中压缩为状态k。F[i,k]表示已i点为中心的联通块,包含的景点为状态k,所需要的最小费用。

对于相邻的点i,j,可进行这样的转移:F[i,x]+F[j,y]——>F[i,x xor y]与F[j,x xor y]。对此进行spfa,记录其是由哪两个情况转移来的。

为了减少复杂度,转移时保证x and y=0

见证奇迹:

(其实有种更优的DP写法,外加PASCAL在BZOJ中不享有明显的O2优化)

代码:

 const
fx:array[..]of longint=(-,,,);
fy:array[..]of longint=(,-,,);
var
i,j,k:longint;
n,m,ans1,ans2,cnt,s,e,fro1,fro2,to1,to2,pos:longint;
map,map2:array[..,..]of longint;
a:array[..,..,..,..]of longint;
bo:array[..,..,..]of longint;
f:array[..,..]of longint;
procedure ss(x,y,z:longint);
begin
map2[x,y]:=;
if(a[x,y,z,]=)or(a[x,y,z,]=)then exit;
ss(x,y,a[x,y,z,]);
ss(a[x,y,z,],a[x,y,z,],z xor a[x,y,z,]);
end;
procedure wh(x,y:longint);
begin
if x>cnt then
begin
if a[fro1,fro2,pos,]+a[to1,to2,y,]<a[to1,to2,pos or y,] then
begin
a[to1,to2,pos or y,]:=a[fro1,fro2,pos,]+a[to1,to2,y,];
a[to1,to2,pos or y,]:=fro1; a[to1,to2,pos or y,]:=fro2;
a[to1,to2,pos or y,]:=y;
if bo[to1,to2,pos or y]= then
begin
bo[to1,to2,pos or y]:=;
inc(e); if e= then e:=;
f[e,]:=to1; f[e,]:=to2; f[e,]:=pos or y;
end;
end;
if a[fro1,fro2,pos,]+a[to1,to2,y,]<a[fro1,fro2,pos or y,] then
begin
a[fro1,fro2,pos or y,]:=a[fro1,fro2,pos,]+a[to1,to2,y,];
a[fro1,fro2,pos or y,]:=to1; a[fro1,fro2,pos or y,]:=to2;
a[fro1,fro2,pos or y,]:=pos;
if bo[fro1,fro2,pos or y]= then
begin
bo[fro1,fro2,pos or y]:=;
inc(e); if e= then e:=;
f[e,]:=fro1; f[e,]:=fro2; f[e,]:=pos or y;
end;
end;
exit;
end;
if pos and( shl(x-))= then
wh(x+,y or( shl(x-)));
wh(x+,y);
end;
begin
readln(n,m);
for i:= to n do
for j:= to m do
for k:= to do a[i,j,k,]:=maxlongint div ;
for i:= to n do
for j:= to m do
begin
read(map[i,j]);
if map[i,j]= then
begin
inc(e); inc(cnt); f[e,]:=i; f[e,]:=j; f[e,]:= shl(cnt-);
a[i,j,f[e,],]:=; bo[i,j,f[e,]]:=;
end else
begin
inc(e); f[e,]:=i; f[e,]:=j; f[e,]:=;
a[i,j,,]:=map[i,j]; bo[i,j,]:=;
end;
end;
a[,,( shl cnt)-,]:=maxlongint;
while s<>e do
begin
inc(s); if s= then s:=;
fro1:=f[s,]; fro2:=f[s,]; pos:=f[s,];
if(pos=( shl cnt)-)and(a[fro1,fro2,pos,]<a[ans1,ans2,pos,])
then begin ans1:=fro1; ans2:=fro2; end;
bo[fro1,fro2,pos]:=;
for i:= to do
if(fro1+fx[i]>=)and(fro1+fx[i]<=n)and(fro2+fy[i]>=)and(fro2+fy[i]<=m)
then begin
to1:=fro1+fx[i]; to2:=fro2+fy[i];
wh(,);
end;
end;
writeln(a[ans1,ans2,( shl cnt)-,]);
ss(ans1,ans2,( shl cnt)-);
for i:= to n do
begin
for j:= to m do
begin
if map[i,j]= then write('x')
else if map2[i,j]= then write('o')
else write('_');
end;
writeln;
end;
end.

BZOJ2595[WC2008]游览计划的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 斯坦纳树 [bzoj2595][wc2008]游览计划 题解

    话说挺早就写过斯坦纳树了,不过当时没怎么总结,也不是很理解……现在来个小结吧~ 斯坦纳树就是包含给定点的最小生成树(个人理解权值应当为正). 一般来讲,给定点的数目应该很小吧...于是我们可以用状压D ...

  7. bzoj2595: [Wc2008]游览计划 斯坦纳树

    斯坦纳树是在一个图中选取某些特定点使其联通(可以选取额外的点),要求花费最小,最小生成树是斯坦纳树的一种特殊情况 我们用dp[i][j]来表示以i为根,和j状态是否和i联通,那么有 转移方程: dp[ ...

  8. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][ ...

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

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

随机推荐

  1. 《数据结构与算法Python语言描述》习题第二章第一题(python版)

    题目:定义一个表示时间的类Timea)Time(hours,minutes,seconds)创建一个时间对象:b)t.hours(),t.minutes(),t.seconds()分别返回时间对象t的 ...

  2. PHP程序员的技术成长规划

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  3. Java基础学习 -- I/O系统、流

    Java类库里有四个表示流的抽象父类:InputStream.OutputStream.Reader.Writer. 其中 InputStream 和 OutputStream 是对字节进行操作的输入 ...

  4. HTML5有特色的进度条

    查看效果:http://keleyi.com/keleyi/phtml/html5/26.htm 完整代码如下: <!DOCTYPE html> <html> <head ...

  5. AMD and CMD are dead之KMD.js之懒

    缘由 "懒"在软件设计中,有着重大的意义.最常见的两种"懒",便是: 懒得计算 懒得加载 "懒得计算"常见于服务器端: 比如Multipla ...

  6. Java的异常处理

    Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的:       Throws: Lists the ...

  7. GIT命令行的使用

    新手了解 有不对的地方指点下 首先, 了解下什么是GIT,GIT是一款开元的分布式版本控制工具, 在世界上的所有分布式版本控制工具中,GIT是最简单,最流行,同时也是最常用的 相比于其他版本的控制工具 ...

  8. 解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2

    步骤如下: rvm install ruby-2.2 但是,但是竟然报错了,具体我忘记额,但是是权限和brew的问题,那么我又转向修复brew: // 清理原来brew rm -rf /usr/loc ...

  9. Linux命令学习总结:hexdump

    命令简介: hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII.八进制.十进制.十六进制格式进行查看. 指令所在路径:/usr/bin/hexdump 命令语法: ...

  10. WebForm(四)——Repeater控件(重要、好用)

    Repeater控件,可以用来一次显示一组数据项.比如,可以用它们显示一个数据表中的所有行.             Repeater控件完全由模板驱动,提供了最大的灵活性,可以任意设置它的输出格式. ...