题目描述

题解:

这道题是斯坦纳树的典型例题。

首先看一眼数据范围发现$10$的范围不状压对不起出题人,然后考虑转移。

设$f[i][j][s]$表示当前在点$(i,j)$,覆盖特殊节点状态为$s$的最小花费。

转移有:

1.$s$不变,此时有$f[i][j][s]=min(f[i'][j'][s]+a[i'][j'])$;

2.$(i,j)$不变,此时有$f[i][j][s]=min(f[i][j][t]+f[i][j][s$^$t])$,其中$t$是$s$的子集。

转移1是最短路形式,我们可用spfa转移;

转移2直接枚举子集。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 15
int n,m;
int f[N][N][1<<10],mp[N][N];
int cnt;
struct Pair
{int x,y;Pair(){}Pair(int x,int y):x(x),y(y){}
}p[N];
struct Three
{int x,y,s;Three(){}Three(int x,int y,int s):x(x),y(y),s(s){}
}fa[N][N][1<<10];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool vis[N][N];
queue<Pair>q;
bool check(int x,int y)
{return x>=1&&x<=n&&y>=1&&y<=m;
}
void spfa(int s)
{while(!q.empty()){Pair tp = q.front();q.pop();int x = tp.x,y = tp.y,tx,ty;for(int i=0;i<4;i++){tx = x+dx[i],ty = y+dy[i];if(!check(tx,ty))continue;if(f[x][y][s]+mp[x][y]<f[tx][ty][s]){f[tx][ty][s]=f[x][y][s]+mp[x][y];fa[tx][ty][s] = Three(x,y,s);if(!vis[tx][ty]){q.push(Pair(tx,ty));vis[tx][ty] = 1;}}}vis[x][y] = 0;}
}
bool ot[N][N];
void dfs(int x,int y,int s)
{if(!check(x,y))return ;ot[x][y] = 1;Three tmp = fa[x][y][s];if(tmp.s==s){dfs(tmp.x,tmp.y,s);}else{dfs(tmp.x,tmp.y,tmp.s);dfs(tmp.x,tmp.y,s^tmp.s);}
}
int main()
{
//        freopen("7.in","r",stdin);scanf("%d%d",&n,&m);memset(f,0x3f,sizeof(f));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&mp[i][j]);if(!mp[i][j]){p[cnt] = Pair(i,j);f[i][j][1<<cnt] = 0;cnt++;}}}for(int s = 1;s<(1<<cnt);spfa(s),s++)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){for(int t=s&(s-1);t;t=(t-1)&s)if(f[i][j][s]>f[i][j][s^t]+f[i][j][t]){f[i][j][s]=f[i][j][s^t]+f[i][j][t];fa[i][j][s] = Three(i,j,t);}if(f[i][j][s]<0x3f3f3f3f)q.push(Pair(i,j)),vis[i][j]=1;}printf("%d\n",f[p[0].x][p[0].y][(1<<cnt)-1]);dfs(p[0].x,p[0].y,(1<<cnt)-1);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(!mp[i][j])putchar('x');else if(ot[i][j])putchar('o');else putchar('_');}puts("");}return 0;
}

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10206806.html

bzoj2595 [Wc2008]游览计划相关推荐

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

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

  2. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge Submit: 1572  Solved:  ...

  3. P4294 [WC2008]游览计划

    题目链接 题目描述 从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 NNN 行 MMM 列 ( ...

  4. [WC2008]游览计划(斯坦纳树)

    [Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...

  5. [WC2008]游览计划

    嘟嘟嘟 都说这题是斯坦纳树的板儿题. 斯坦纳树,我也不知道为啥起这么个名儿,斯坦纳树主要用来解决这样一类问题:带边权无向图上有几个(一般约10个)点是[关键点],要求选择一些边使这些点在同一个联通块内 ...

  6. [Wc2008]游览计划 斯坦纳树

    Description 给一张网格图,有一些点必须选,必选的的店无价值,其余有价值,问把必须点全部连起来的最小代价. Sample Input 4 4 0 1 1 0 2 5 5 1 1 5 5 1 ...

  7. LCP 16. 游乐园的游览计划

    LCP 16. 游乐园的游览计划 题目 又到了一年一度的春游时间,小吴计划去游乐场游玩 1 天,游乐场总共有 N 个游乐项目,编号从 0 到 N-1.小吴给每个游乐项目定义了一个非负整数值 value ...

  8. 蓝桥杯 游览计划 (Python实现)

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧. 八云紫(咦这是怎么中枪的?)从起点 ...

  9. 试题 算法提高 游览计划

    资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千 ...

最新文章

  1. [UGUI]圆形Image
  2. 超详细轮播图的三种实现方法html+css+javascript
  3. 单个字段去重并保留其他字段值
  4. Linux环境下安装jenkins
  5. 史上最全的CSS hack方式一览
  6. Silverlight动画制作之From/To/By基本动画
  7. 震惊! Leftmost Digit
  8. SAP License:获利分析的两种方式比较
  9. C中文件的输入输出与C++的文件流
  10. 利用deepface网络进行表情分类
  11. 不属于python第三方程序_安装 selenium 对于python而言属于一个第三方的模块
  12. PropertyUtils嵌套属性的使用
  13. 解决“npm WARN requires a peer of XXX“问题
  14. 2017年苹果开发者账号申请——账号VISA卡支付流程
  15. 教你巧用万用表测量大值电阻
  16. 面试技巧:HR常问的70个问题回答技巧
  17. 计算机搜不到word了,电脑word找不到路径
  18. python爬斗鱼直播房间名和主播名_python3爬取斗鱼某些版块的主播人气
  19. 移动云API开放平台助力开发者驰骋云端
  20. python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件

热门文章

  1. 02_Storm集群部署
  2. Java Garbage Collection基础详解------Java 垃圾回收机制技术详解
  3. 浏览器输入一个url会发生什么
  4. onload、DOMContentLoaded、$(document).ready(fn)、$(document).load(fn)
  5. LeetCode(509)——斐波那契数(JavaScript)
  6. ★LeetCode(292)——Nim 游戏(JavaScript)
  7. mysql中游标能不能更新数据库_数据库游标更新数据
  8. 什么是bigdata
  9. 买基金,是长期持有好,还是短线操作好?
  10. 过几天就退休了,目前情况下可不可以请同事们吃饭呢?