bzoj:2595: [Wc2008]游览计划
Description
.jpg)

Input
第一行有两个整数,N和 M,描述方块的数目。 
接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点;
否则表示控制该方块至少需要的志愿者数目。 相邻的整数用 (若干个) 空格隔开,
行首行末也可能有多余的空格。
Output
由 N + 1行组成。第一行为一个整数,表示你所给出的方案
中安排的志愿者总数目。 
接下来 N行,每行M 个字符,描述方案中相应方块的情况: 
z  ‘_’(下划线)表示该方块没有安排志愿者; 
z  ‘o’(小写英文字母o)表示该方块安排了志愿者; 
z  ‘x’(小写英文字母x)表示该方块是一个景点; 
注:请注意输出格式要求,如果缺少某一行或者某一行的字符数目和要求不
一致(任何一行中,多余的空格都不允许出现) ,都可能导致该测试点不得分。
Sample Input
0 1 1 0
2 5 5 1
1 5 5 1
0 1 1 0
Sample Output
xoox
___o
___o
xoox
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std; struct na{
int x,y,k;
na(){
x=-;
}
na(int xx,int yy,int kk):x(xx),y(yy),k(kk){}
};
int n,m,num=,y;
int map[][],bi[][];
int dp[][][(<<)+];
bool bo[][][(<<)+],mp[][];
na ro[][][(<<)+];
queue <na> q;
const int INF=1e8;
const int fx[]={,,,-},fy[]={,-,,};
inline void spfa(){
register int k,xx,yy,kk;
while(!q.empty()){
na no=q.front();
q.pop();
bo[no.x][no.y][no.k]=;
for (k=;k<;k++){
xx=no.x+fx[k];yy=no.y+fy[k];kk=no.k|bi[xx][yy];
if (xx<||yy<||xx>=n||yy>=m) continue;
if (dp[xx][yy][no.k|bi[xx][yy]]>dp[no.x][no.y][no.k]+map[xx][yy]){
dp[xx][yy][kk]=dp[no.x][no.y][no.k]+map[xx][yy];
ro[xx][yy][kk]=no;
if (!bo[xx][yy][kk]){
bo[xx][yy][kk]=;
q.push(na(xx,yy,kk));
}
}
}
}
}
inline void dfs(int x,int y,int k){
mp[x][y]=;
if (ro[x][y][k].x==-) return;
dfs(ro[x][y][k].x,ro[x][y][k].y,ro[x][y][k].k);
if (ro[x][y][k].x==x&&ro[x][y][k].y==y) dfs(x,y,(k^ro[x][y][k].k)|bi[x][y]);
}
int main(){
register int i,j,k,x;
scanf("%d%d",&n,&m);
for (i=;i<n;i++)
for (j=;j<m;j++){
scanf("%d",&map[i][j]);
if (!map[i][j]) bi[i][j]=<<num,num++;
}
for (i=;i<n;i++)
for (j=;j<m;j++)
for (k=;k<<<num;k++) dp[i][j][k]=(bi[i][j]&&(bi[i][j]==k))?:INF;
for (k=;k<<<num;k++){
for (i=;i<n;i++)
for (j=;j<m;j++){
if (bi[i][j]&&!(bi[i][j]&k)) continue;
for (x=k;x;x=(x-)&k){
y=dp[i][j][x|bi[i][j]]+dp[i][j][(k^x)|bi[i][j]]-map[i][j];
if (y<dp[i][j][k]) dp[i][j][k]=y,ro[i][j][k]=na(i,j,x|bi[i][j]);
}
if (dp[i][j][k]!=INF) q.push(na(i,j,k)),bo[i][j][k]=;
}
spfa();
}
k--;
for (i=;i<n;i++)
for (j=;j<m;j++)
if (bi[i][j]){
printf("%d\n",dp[i][j][k]);
na o=ro[i][j][k];
dfs(i,j,k);
for (int ii=;ii<n;ii++){
for (int jj=;jj<m;jj++)
if (map[ii][jj]==) printf("x");else
if (mp[ii][jj]) printf("o");else printf("_");
printf("\n");
}
return ;
}
}
bzoj:2595: [Wc2008]游览计划的更多相关文章
- bzoj 2595 [Wc2008]游览计划(斯坦纳树)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...
 - BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】
		
传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...
 - BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)
		
题目链接 f[i][s]表示以i为根节点,当前关键点的连通状态为s(每个点是否已与i连通)时的最优解.i是枚举得到的根节点,有了根节点就容易DP了. 那么i为根节点时,其状态s的更新为 \(f[i][ ...
 - BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
		
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
 - 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
		
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
 - 【BZOJ】2595: [Wc2008]游览计划
		
题意 \(n * m\)的网格,如果\(a_{i, j} = 0\)则表示景点,否则表示这里的需要的志愿者人数.求一种安排志愿者的方案使得所有景点连通且志愿者最少. 分析 本题可以插头dp,然而有一个 ...
 - 【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 ...
 
随机推荐
- 截屏  iOS
			
#pragma mark - 截屏 + (UIImage *_Nonnull)screenShotWithController:(UIViewController *_Nonnull)controll ...
 - 多表连接时USING和ON的区别,USING会去掉重复列,ON显示重复列。
 - shell编辑crontab任务
			
crontab是Linux下执行定时任务的工具,之前偶尔需要用到时都是通过执行crontab -e命令或者通过root身份直接编辑/etc/cron.*/下的文件来添加定时任务.这段时间遇到了需要通过 ...
 - HttpClient4.5 post请求xml到服务器
			
1.加入HttpClient4.5和junit依赖包 <dependencies> <dependency> <groupId>org.apache.httpcom ...
 - pstree 命令详解
			
作用: 以命令树状图的方式展现进程之间的派生关系, 显示效果比较直观. 选项: -a 显示每个程序的完整指令, 包含路径, 参数或者是常驻服务的标志 -c 不使用精简标示法 -h 列出树状图,特别标明 ...
 - 视频流GPU解码在ffempg的实现(一)-基本概念
			
这段时间在实现Gpu的视频流解码,遇到了很多的问题. 得到了阿里视频处理专家蔡鼎老师以及英伟达开发季光老师的指导,在这里表示感谢! 基本命令(linux下) 1.查看物理显卡 lspci | grep ...
 - ES6(四)字符串的扩展
			
1.字符的表示方式 最早在 \u0000-\uFFFF 之间的字符已经足够使用吗,每个字符占两个字节,超出范围,必须使用双字节形式表达, 即每个字符占四个字节.超出范围的字符,会被解读成 \uXX ...
 - JSP EL隐含对象
			
JSP 内置对象 JSP EL隐含对象 描述 page pageScope page 作用域 request requestScope request 作用域 session sessionScope ...
 - 转:java 可设置最大内存
			
测试方法:在命令行下用 java -XmxXXXXM -version ,比如:java -Xmx1024M -version命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大 ...
 - Java常用命令与参数设置
			
我介绍的JDK版本: 首先.介绍下JDK常用参数设置,如下是我个人环境的参数: -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m 我们 ...