bzoj2595 [Wc2008]游览计划
题目描述
题解:
这道题是斯坦纳树的典型例题。
首先看一眼数据范围发现$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]游览计划相关推荐
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 2030 Solved: 986 [Submit][Status ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 1572 Solved: ...
- P4294 [WC2008]游览计划
题目链接 题目描述 从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 NNN 行 MMM 列 ( ...
- [WC2008]游览计划(斯坦纳树)
[Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...
- [WC2008]游览计划
嘟嘟嘟 都说这题是斯坦纳树的板儿题. 斯坦纳树,我也不知道为啥起这么个名儿,斯坦纳树主要用来解决这样一类问题:带边权无向图上有几个(一般约10个)点是[关键点],要求选择一些边使这些点在同一个联通块内 ...
- [Wc2008]游览计划 斯坦纳树
Description 给一张网格图,有一些点必须选,必选的的店无价值,其余有价值,问把必须点全部连起来的最小代价. Sample Input 4 4 0 1 1 0 2 5 5 1 1 5 5 1 ...
- LCP 16. 游乐园的游览计划
LCP 16. 游乐园的游览计划 题目 又到了一年一度的春游时间,小吴计划去游乐场游玩 1 天,游乐场总共有 N 个游乐项目,编号从 0 到 N-1.小吴给每个游乐项目定义了一个非负整数值 value ...
- 蓝桥杯 游览计划 (Python实现)
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧. 八云紫(咦这是怎么中枪的?)从起点 ...
- 试题 算法提高 游览计划
资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千 ...
最新文章
- [UGUI]圆形Image
- 超详细轮播图的三种实现方法html+css+javascript
- 单个字段去重并保留其他字段值
- Linux环境下安装jenkins
- 史上最全的CSS hack方式一览
- Silverlight动画制作之From/To/By基本动画
- 震惊! Leftmost Digit
- SAP License:获利分析的两种方式比较
- C中文件的输入输出与C++的文件流
- 利用deepface网络进行表情分类
- 不属于python第三方程序_安装 selenium 对于python而言属于一个第三方的模块
- PropertyUtils嵌套属性的使用
- 解决“npm WARN requires a peer of XXX“问题
- 2017年苹果开发者账号申请——账号VISA卡支付流程
- 教你巧用万用表测量大值电阻
- 面试技巧:HR常问的70个问题回答技巧
- 计算机搜不到word了,电脑word找不到路径
- python爬斗鱼直播房间名和主播名_python3爬取斗鱼某些版块的主播人气
- 移动云API开放平台助力开发者驰骋云端
- python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件
热门文章
- 02_Storm集群部署
- Java Garbage Collection基础详解------Java 垃圾回收机制技术详解
- 浏览器输入一个url会发生什么
- onload、DOMContentLoaded、$(document).ready(fn)、$(document).load(fn)
- LeetCode(509)——斐波那契数(JavaScript)
- ★LeetCode(292)——Nim 游戏(JavaScript)
- mysql中游标能不能更新数据库_数据库游标更新数据
- 什么是bigdata
- 买基金,是长期持有好,还是短线操作好?
- 过几天就退休了,目前情况下可不可以请同事们吃饭呢?