AC日记——[Wc2008]游览计划 bzoj 2595
思路:
状压DP+spfa转移+dfs输出路径;
或者,斯坦纳树算法模板;
来,上代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define INF 0x7ffffff struct NodeType {
int x,y,s;
};
struct NodeType pre[][][]; const int dx[]={,-,,,};
const int dy[]={,,,,-}; int n,m,map[][],num,bi[],all,dp[][][],ans; bool if_[][],cho[][]; queue<NodeType>que; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} void read()
{
in(n),in(m),bi[]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
in(map[i][j]);
if(!map[i][j]) num++;
}
}
for(int i=;i<=num;i++) bi[i]=bi[i-]<<;
all=bi[num]-;
} void spfa(int f)
{
while(!que.empty())
{
NodeType now=que.front();que.pop(),if_[now.x][now.y]=false;
for(int i=;i<=;i++)
{
int x=now.x+dx[i],y=now.y+dy[i];
if(x>&&x<=n&&y>&&y<=m)
{
if(dp[x][y][f]>dp[now.x][now.y][f]+map[x][y])
{
dp[x][y][f]=dp[now.x][now.y][f]+map[x][y];
pre[x][y][f]=(NodeType){now.x,now.y,now.s};
if(!if_[x][y]) que.push((NodeType){x,y,f}),if_[x][y]=true;
}
}
}
}
} void dfs(int x,int y,int s)
{
if(x>INF||pre[x][y][s].s==) return ;
cho[x][y]=true;
dfs(pre[x][y][s].x,pre[x][y][s].y,pre[x][y][s].s);
if(x==pre[x][y][s].x&&y==pre[x][y][s].y) dfs(x,y,s-pre[x][y][s].s);
} void solve()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int v=;v<=all;v++) dp[i][j][v]=INF;
}
}
int F=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j]) dp[i][j][bi[F++]]=;
}
}
for(int S=;S<=all;S++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int s=S&(S-);s;s=S&(s-))
{
int tmp=dp[i][j][s]+dp[i][j][S-s]-map[i][j];
if(tmp<dp[i][j][S])
{
dp[i][j][S]=tmp;
pre[i][j][S]=(NodeType){i,j,s};
}
}
if(dp[i][j][S]<INF) que.push((NodeType){i,j,S}),if_[i][j]=true;
}
}
spfa(S);
}
int ex,ey;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j])
{
ex=i,ey=j,ans=dp[i][j][all];
break;
}
}
}
dfs(ex,ey,all);
} void print()
{
printf("%d\n",ans);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j]) putchar('x');
else if(cho[i][j]) putchar('o');
else putchar('_');
}
putchar('\n');
}
} int main()
{
read();
solve();
print();
return ;
}
AC日记——[Wc2008]游览计划 bzoj 2595的更多相关文章
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
随机推荐
- laravel5.5用户认证源码分析
目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...
- centos使用--vim配置和推荐插件使用
目录 1.vimrc的配置内容 2.Vundle使用 简介 安装vundle 配置vundle插件: 安装需要的插件 移除不需要的插件 其他常用命令 3 使用插件 3.1 NERDTree 3.2 e ...
- android中Activity中的WindowManager与Window
在做项目的过程中,需要实现Activity非全屏显示.窗口背景透明显示的效果. 在实现这些功能的过程中,涉及到Window与WindowManager两个类,经过查一些相关资料,了解二者之间的不同点如 ...
- 《Cracking the Coding Interview》——第18章:难题——题目1
2014-04-29 00:56 题目:不用算数运算,完成加法. 解法:那就位运算吧,用加法器的做法就可以了. 代码: // 18.1 add two numbers wihout using ari ...
- python学习笔记五:模块和包
一.模块用import导入 cal.py: #!/usr/bin/python def add(x,y): return x+y if __name__ == '__main__': print ad ...
- 在.net2.0中实现Action和Func方法
由于这两个是在.net3.5中新加入的特性,所以我们需要自己写一下. 格式如下: delegate void Action(); delegate void Action<T, T ...
- MySQL之优化总结
http://www.cnblogs.com/benshan/archive/2012/07/27/2612212.html MySQL之优化总结 今天,数据库的操作越来越成为整个应用的性能瓶颈 ...
- MyBatis:SQL语句中的foreach标签的详细介绍
foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面 foreach元素的属性主要有 item,index,collection,open,separator,close. 分别 ...
- 【bzoj3144】[Hnoi2013]切糕 网络流最小割
题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
- BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】
题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...