BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树
题意:

分析:
斯坦纳树裸题,有几个需要注意的地方
给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值
方案记录比较麻烦,两边的转移都需要记录,最后dfs找方案会比较容易理解
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define N 110
#define LL long long
priority_queue <pair <int,int> >q;
LL map[11][11],dis[1<<10][N];
int chosex[1<<10][N],chosey[1<<10][N];
bool change[1<<10][N];
int flg[11][11];
int n,m;
int tx[]={1,-1,0,0};
int ty[]={0,0,1,-1};
int id[N][N],a[N],xx[N],yy[N],cnt,vis[1<<10][N];
void dfs(int sta,int p){
if(!dis[sta][p])return ;
flg[xx[p]][yy[p]]=1;
if(change[sta][p]){
dfs(chosex[sta][p],p);
dfs(chosey[sta][p],p);
}else dfs(sta,id[chosex[sta][p]][chosey[sta][p]]);
}
int main(){
scanf("%d%d",&n,&m);
int i,j,tot=0,k,x;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%lld",&map[i][j]);
id[i][j]=++tot;
xx[tot]=i;yy[tot]=j;
if(!map[i][j]){
a[++cnt]=tot;
}
}
}
int mask=(1<<cnt)-1;
memset(dis,0x3f,sizeof(dis));
for(i=1;i<=cnt;i++){
dis[1<<i-1][a[i]]=0;
}
for(j=1;j<=mask;j++){
for(i=1;i<=n*m;i++){
for(k=j&(j-1);k;k=j&(k-1)){
if(dis[j][i]>dis[k][i]+dis[j-k][i]-map[xx[i]][yy[i]]){
dis[j][i]=dis[k][i]+dis[j-k][i]-map[xx[i]][yy[i]];
chosex[j][i]=k,chosey[j][i]=j-k;
change[j][i]=1;
}
// dis[j][i]=min(dis[j][i],dis[k][i]+dis[j-k][i]-map[xx[i]][yy[i]]);
}
}
for(i=1;i<=n*m;i++){
q.push(make_pair(-dis[j][i],i));
}
while(!q.empty()){
x=q.top().second;q.pop();
if(vis[j][x])continue;
vis[j][x]=1;
int nx=xx[x],ny=yy[x];
for(i=0;i<4;i++){
int dx=nx+tx[i],dy=ny+ty[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m){
if(dis[j][id[dx][dy]]>dis[j][x]+map[dx][dy]){
dis[j][id[dx][dy]]=dis[j][x]+map[dx][dy];
chosex[j][id[dx][dy]]=nx;
chosey[j][id[dx][dy]]=ny;
change[j][id[dx][dy]]=0;
q.push(make_pair(-dis[j][id[dx][dy]],id[dx][dy]));
}
}
}
}
}
LL ans=1ll<<60;
int end;
for(i=1;i<=n*m;i++){
if(ans>dis[mask][i]){
ans=dis[mask][i];
end=i;
}
// ans=min(ans,dis[mask][i]);
}
dfs(mask,end);
printf("%lld\n",ans);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(!map[i][j]){
printf("x");
}else if(flg[i][j]){
printf("o");
}else printf("_");
}
puts("");
}
}
BZOJ_2595_[Wc2008]游览计划_斯坦纳树的更多相关文章
- 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- bzoj 2595 [Wc2008]游览计划(斯坦纳树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...
- BZOJ2595 WC2008游览计划(斯坦纳树)
斯坦纳树板子题. 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案. 转移时首先枚举子集,有f[i][j][S]=min{f[i][j ...
- [WC2008]游览计划(斯坦纳树)
[Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...
- BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)
题目链接 f[i][s]表示以i为根节点,当前关键点的连通状态为s(每个点是否已与i连通)时的最优解.i是枚举得到的根节点,有了根节点就容易DP了. 那么i为根节点时,其状态s的更新为 \(f[i][ ...
- [WC2008]游览计划 「斯坦那树模板」
斯坦那树 百度释义 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开 ...
- BZOJ_4006_[JLOI2015]管道连接_斯坦纳树
BZOJ_4006_[JLOI2015]管道连接_斯坦纳树 题意: 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m ...
- WC 2008 观光计划(斯坦纳树)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2595 思路 是一道比较裸的斯坦纳树呢- 题意等价于选出包含一些点的最小生成树,这就是斯坦纳树 ...
随机推荐
- CDH安装系统环境准备——系统版本和安装包下载地址指南
由于Hadoop深受客户欢迎,许多公司都推出了各自版本的Hadoop,也有一些公司则围绕Hadoop开发产品.在Hadoop生态系统中,规模最大.知名度最高的公司则是Cloudera.接下来的日子里, ...
- 修改input属性placeholder的样式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C 四则运算表达式解析器
下载实例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074 程序主要包括:基础结构定义.词法分析.语法分 ...
- 学习Timer定时器
原文地址:http://www.cppblog.com/ivenher/articles/19969.html setTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器 ...
- JAVA 第一张 使用记事本编写代码
使用记事本开发JAVA程序的步骤
- Hbase出现ERROR: Can't get master address from ZooKeeper; znode data == null解决办法
问题描述如下: hbase(main)::> list TABLE ERROR: Can't get master address from ZooKeeper; znode data == n ...
- vscode 停用插件自动更新
- LeetCode_图像渲染
题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 ne ...
- swagger上传文件并支持jwt认证
背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...
- Junit-4.1.2 @Test 使用
学习使用Junit-4.1.2 @Test来做单元测试 1.下载jar包 下载junit-4.12.jar 下载hamcrest-core-1.3.jar 2.在External Libraries中 ...