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$为根的最小代 ...
随机推荐
- Spark-Streaming 常用流式计算算子
UpdateStateByKey 使用说明:维护key的状态. 使用注意:使用该算子需要设置checkpoint 使用示例: object UpdateStateByKeyTest { def mai ...
- centso下如何解压RAR文件
tar -xvf rarlinux-3.9.3.tar.gz cd rar make 看见下面这些信息就是安装成功了 mkdir -p /usr/local/bin mkdir -p /usr/l ...
- AlphaGo原理-蒙特卡罗树搜索+深度学习
蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记 目录(?)[+] 原版论文是<Mastering the game of Go with deep neural ne ...
- PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
应宝哥建议以及更好的交流学习,这篇开始使用中文,英语就先放一放吧! 要使用PJSIP中的PJMEDIA首先我们需要搭建好它所需要的环境. [环境搭建与调试] 1 在 工具 加入pjmedia所需要的包 ...
- VS调试时不捕捉Exception
在方法上添加 [DebuggerHidden] 这样,发生错误的时候,VS就不会捕捉到这个错误,否则,会在错误的地方中断. [DebuggerHidden] public void DeleteAll ...
- Thread 线程池
Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...
- Json对象转json数组
var arr = []; arr.push(strData);
- 【bzoj2506】calc 根号分治+STL-vector+二分+莫队算法
题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n ...
- 在Linux上录制终端的操作
在Linux上录制终端的操作 来源 http://blog.51cto.com/stuart/1831570 一.安装基础软件包 1 [root@test software]# yum install ...
- BZOJ1296 [SCOI2009]粉刷匠 【dp】
题目 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被粉刷 ...