P4294-[WC2008]游览计划【斯坦纳树】
正题
题目链接:https://www.luogu.com.cn/problem/P4294
题目大意
n∗mn*mn∗m的网格,每个格子的修建费用不同,要求修建费用最小连接所有关键点。
解题思路
设fs,i,jf_{s,i,j}fs,i,j表示目前连接关键点状态为sss,在(i,j)(i,j)(i,j)这个位置时的最小代价,然后同sss的用spfaspfaspfa转移即可。
输出方案记录一下前驱,如果分裂开就分开两个赋值即可。
时间复杂度O(3knm)O(3^knm)O(3knm)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=13,S=1<<13;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m,cnt,a[N][N],g[N][N];
int f[S][N][N],pre[S][N][N];
bool v[N][N],w[N][N];
queue<pair<int,int> >q;
void SPFA(int s){for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)q.push(mp(i,j)),v[i][j]=1;while(!q.empty()){int x=q.front().first,y=q.front().second;for(int k=0;k<4;k++){int zx=x+dx[k],zy=y+dy[k];if(zx<1||zy<1||zx>n||zy>m)continue;if(f[s][x][y]+a[zx][zy]<f[s][zx][zy]){f[s][zx][zy]=f[s][x][y]+a[zx][zy];pre[s][zx][zy]=-k-1;if(!v[zx][zy])q.push(mp(zx,zy)),v[zx][zy]=1;}}q.pop();v[x][y]=0;}return;
}
void dfs(int s,int x,int y){w[x][y]=1;int z=pre[s][x][y];if(!pre[s][x][y])return;if(z<0)dfs(s,x-dx[-z-1],y-dy[-z-1]);else dfs(z,x,y),dfs(s-z,x,y);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);if(a[i][j]==0)g[i][j]|=(1<<(cnt++));}int MS=(1<<cnt);memset(f,0x3f,sizeof(f));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!a[i][j])f[g[i][j]][i][j]=0;for(int s=0;s<MS;s++){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int l=s;while(l){l=((l-1)&s);if(!l)break;if(max(f[l][i][j],f[s-l][i][j])<1e9)if(f[l][i][j]+f[s-l][i][j]-a[i][j]<f[s][i][j]){f[s][i][j]=f[l][i][j]+f[s-l][i][j]-a[i][j];pre[s][i][j]=l;}}}SPFA(s);}int mx=1,my=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(f[MS-1][i][j]<f[MS-1][mx][my])mx=i,my=j;printf("%d\n",f[MS-1][mx][my]);dfs(MS-1,mx,my);for(int i=1;i<=n;i++,putchar('\n'))for(int j=1;j<=m;j++){if(!a[i][j])putchar('x');else if(w[i][j])putchar('o');else putchar('_');}
}
P4294-[WC2008]游览计划【斯坦纳树】相关推荐
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 2030 Solved: 986 [Submit][Status ...
- [Wc2008]游览计划 斯坦纳树
Description 给一张网格图,有一些点必须选,必选的的店无价值,其余有价值,问把必须点全部连起来的最小代价. Sample Input 4 4 0 1 1 0 2 5 5 1 1 5 5 1 ...
- P4294 [WC2008]游览计划
题目链接 题目描述 从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 NNN 行 MMM 列 ( ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 1572 Solved: ...
- [WC2008]游览计划(斯坦纳树)
[Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...
- 业界萌新对斯坦纳树的小结
业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使 ...
- [学习笔记]斯坦纳树
处理一种这样的问题: 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络 ...
- [THUSC2017][斯坦纳树+随机化]巧克力
题面 [题目描述] "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成 n n n行 m m m列.每一小块都有自己特别的图 ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
最新文章
- 【重磅】Waymo无人车高层组团出走?CFO今日也走了!
- 升级到12c云数据库的最佳实践
- EOS 执行合约报错, CODE: 3090003
- 201671010103 2016-2017-2 《Java程序设计》第十二周学习心得
- ORA-28000: the account is locked 的解决办法!
- Spring Boot + Vue 前后端分离开发,权限管理的一点思路
- Java技术:serialVersionUID作用介绍
- php内核分析(六)-opcode
- 北大学霸:高考有漏洞可钻,学会套路,立马提分,屡试不爽!
- 图形的装饰教案计算机,《电脑图案设计师》教案教学设计
- [vscode] python debugging
- android 过滤ip,EditText Android过滤器的IP地址###。###。###。###?
- 装tensorflow未果
- 星辰数据空号检测API文档
- Python——公司又双叒叕更新通讯录了,利用itchat实现微信速查公司通讯录
- 小恐龙游戏制作挑战:第9天-打完大部分计分器模块的代码
- 通过AT指令将air202 接入阿里云
- 数据增强_炼丹笔记三:数据增强
- 奔驰S400商务型升级前排通风座椅系统,夏天必备的功能
- 【OpenCV】Lab颜色空间
热门文章
- python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...
- php smtp验证,php通过smtp验证登陆
- doxygen如何生成JAVA文档_有用Doxygen生成文档的吗?发一篇Doxygen的使用文档给大家,从网上搜来的。...
- java疯狂讲义内存分配_java疯狂讲义学习:面向对象(上)
- java超长字符序列化_String 字符串最长可以有多长?
- c语言程序设计黄保和第二章,C语言程序设计答案(黄保和编)第6章
- 数据结构——二叉树的层次遍历进阶
- 编程中的一种特殊递归-尾递归
- C++实现各种选择排序(简单选择排序,堆排序)
- C++继承同名静态成员处理