2595: [Wc2008]游览计划

Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 1518  Solved: 714
[Submit][Status][Discuss]

Description

Input

第一行有两个整数,N和 M,描述方块的数目。 
接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点;
否则表示控制该方块至少需要的志愿者数目。 相邻的整数用 (若干个) 空格隔开,
行首行末也可能有多余的空格。

Output

由 N + 1行组成。第一行为一个整数,表示你所给出的方案中安排的志愿者总数目。 
接下来 N行,每行M 个字符,描述方案中相应方块的情况: 
z  ‘_’(下划线)表示该方块没有安排志愿者; 
z  ‘o’(小写英文字母o)表示该方块安排了志愿者; 
z  ‘x’(小写英文字母x)表示该方块是一个景点; 
注:请注意输出格式要求,如果缺少某一行或者某一行的字符数目和要求不
一致(任何一行中,多余的空格都不允许出现) ,都可能导致该测试点不得分。

Sample Input

4 4
0 1 1 0
2 5 5 1
1 5 5 1
0 1 1 0

Sample Output

6
xoox
___o
___o
xoox

HINT

对于100%的数据,N,M,K≤10,其中K为景点的数目。输入的所有整数均在[0,2^16]的范围内

Source

Ljcc930提供SPJ

Solution

现在就是留下板子走人= =

状压dp+spfa松弛一下就可以了。

自己写个破烂模板还要调一会= =,写完后发现网上绝大部分的人都是三个数压起来,只有我弱智的记下来。

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. #define INF 0xf0f0f0f
  9. #define Pa pair<int,int>
  10. #define PPa pair<Pa,int>
  11. #define fi first
  12. #define se second
  13. #define MP make_pair
  14.  
  15. Pa nidx[150];
  16. PPa nidp[250000];
  17. int N,S,M,mp[11][11],bin[11][11];
  18. int idx[11][11],idp[11][11][1<<10],dp[11][11][1<<10],fr[11][11][1<<10];
  19.  
  20. inline void Update(int nx,int ny,int nz,int ox,int oy,int oz,int z)
  21. {
  22. if (dp[nx][ny][nz]>z) dp[nx][ny][nz]=z,fr[nx][ny][nz]=idp[ox][oy][oz];
  23. }
  24.  
  25. int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},visit[150];
  26. queue<int>q;
  27. inline void Spfa(int sta)
  28. {
  29. while (!q.empty()) {
  30. int now=q.front(); visit[now]=0; q.pop();
  31. int x=nidx[now].fi,y=nidx[now].se;
  32. for (int d=0; d<4; d++) {
  33. int tx=x+dx[d],ty=y+dy[d];
  34. if (!tx || !ty || tx>N || ty>M) continue;
  35. if (dp[tx][ty][sta]>dp[x][y][sta]+mp[tx][ty]) {
  36. Update(tx,ty,sta,x,y,sta,dp[x][y][sta]+mp[tx][ty]);
  37. if (!visit[idx[tx][ty]])
  38. q.push(idx[tx][ty]),visit[idx[tx][ty]]=1;
  39. }
  40. }
  41. }
  42. }
  43.  
  44. bool mark[11][11];
  45. inline void Dfs(int x,int y,int sta)
  46. {
  47. if (!fr[x][y][sta]) return;
  48. mark[x][y]=1;
  49. int now=fr[x][y][sta];
  50. int tx=nidp[now].fi.fi,ty=nidp[now].fi.se,ts=nidp[now].se;
  51. Dfs(tx,ty,ts);
  52. if (tx==x && ty==y) Dfs(tx,ty,sta-ts);
  53. }
  54.  
  55. int main()
  56. {
  57. memset(dp,0xf,sizeof(dp));
  58. scanf("%d%d",&N,&M);
  59. for (int i=1; i<=N; i++)
  60. for (int j=1; j<=M; j++) {
  61. scanf("%d",&mp[i][j]);
  62. if (!mp[i][j]) bin[i][j]=1<<(S++),dp[i][j][bin[i][j]]=0;
  63. }
  64.  
  65. for (int i=1,Idx=0,Idp=0; i<=N; i++)
  66. for (int j=1; j<=M; j++) {
  67. idx[i][j]=++Idx; nidx[Idx]=MP(i,j);
  68. for (int k=0; k<(1<<S); k++)
  69. idp[i][j][k]=++Idp,nidp[Idp]=MP(MP(i,j),k);
  70. }
  71.  
  72. for (int k=1; k<(1<<S); k++) {
  73. for (int i=1; i<=N; i++) {
  74. for (int j=1; j<=M; j++) {
  75. for (int s=k&(k-1); s; s=(s-1)&k)
  76. Update(i,j,k,i,j,s,dp[i][j][s]+dp[i][j][k-s]-mp[i][j]);
  77. if (dp[i][j][k]!=INF)
  78. q.push(idx[i][j]),visit[idx[i][j]]=1;
  79. }
  80. }
  81. Spfa(k);
  82. }
  83.  
  84. for (int i=1; i<=N; i++) {
  85. for (int j=1; j<=M; j++)
  86. if (!mp[i][j]) {
  87. printf("%d\n",dp[i][j][(1<<S)-1]);
  88. Dfs(i,j,(1<<S)-1);
  89. for (int x=1; x<=N; x++,puts(""))
  90. for (int y=1; y<=M; y++) {
  91. if (!mp[x][y]) printf("x");
  92. else if (mark[x][y]) printf("o");
  93. else printf("_");
  94. }
  95. return 0;
  96. }
  97. }
  98.  
  99. return 0;
  100. }

  

【BZOJ-2595】游览计划 斯坦纳树的更多相关文章

  1. BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树

    [题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...

  2. 【BZOJ2595】[Wc2008]游览计划 斯坦纳树

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

  3. Luogu 4294 [WC2008]游览计划 | 斯坦纳树

    题目链接 Luogu 4294 (我做这道题的时候BZOJ全站的SPJ都炸了 提交秒WA 幸好有洛谷) 题解 这道题是[斯坦纳树]的经典例题.斯坦纳树是这样一类问题:带边权无向图上有几个(一般约10个 ...

  4. bzoj2595: [Wc2008]游览计划 斯坦纳树

    斯坦纳树是在一个图中选取某些特定点使其联通(可以选取额外的点),要求花费最小,最小生成树是斯坦纳树的一种特殊情况 我们用dp[i][j]来表示以i为根,和j状态是否和i联通,那么有 转移方程: dp[ ...

  5. bzoj2595 [Wc2008]游览计划——斯坦纳树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.c ...

  6. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][ ...

  7. P4294 [WC2008]游览计划 (斯坦纳树)

    题目链接 差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复. 题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了. #include<bi ...

  8. 洛谷4294 [WC2008]游览计划——斯坦纳树

    题目:https://www.luogu.org/problemnew/show/P4294 大概是状压.两种转移,一个是以同一个点为中心,S由自己的子集拼起来:一个是S相同.中心不同的同层转移. 注 ...

  9. @bzoj - 2595@ 游览计划

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 从未来过绍兴的小D有幸参加了Winter Camp 2008,他 ...

随机推荐

  1. hdu 5079 Square

    http://acm.hdu.edu.cn/showproblem.php?pid=5079 题意: n*n网格,每个格子可以涂黑色或白色,有的格子必须涂黑色 问最大白色正方形边长分别为0,1,2,… ...

  2. iOS编码规范参考

    目录      注释 1.1  多行注释 1.2  单行注释 1.3  函数的注释   命名 2.1  常量的命名 2.2  函数的命名 2.3  变量的命名 2.3.1  成员变量 2.3.2  公 ...

  3. redis初使用

    下载地址:https://redis.io/download Redis项目不正式支持Windows.但是,微软开放技术小组开发并维护了针对Win64的Windows端口 windows版下载地址:h ...

  4. jquery的几种ajax方式对比

    jquery的几种ajax方式对比 jquery的ajax方式有如下几种: 1.   $.post(url,params,callback); 2.   $.getJSON(url,params,ca ...

  5. 基于I2C总线的0.96寸OLED显示屏驱动

    资料未整理,先占位置,以后补充

  6. yum安装软件报错:curl#6 - "Could not resolve host: mirrorlist.centos.org; Temporary failure in name resolut

    # yum install -y epel-release Loaded plugins: fastestmirror Repository base is listed more than once ...

  7. ipsec-tools安装教程

    ipsec-tools最新版本为0.8.2,此处以0.7.3版本为例说明安装和使用过程.可参考ipsec-howto. 安装步骤 ipsec-tools依赖于linux2.6版本内核,在安装ipsec ...

  8. JMeter出现“the target server failed to respond“的解决办法

    今天用jmeter压测执行过程中遇到一个报错如下: 解决方案如下: 1. 修改执行计划中,HTTP请求的Implementation为HttpClient4. 2. 保存执行计划 3. 修改JMete ...

  9. css-position属性实例1

    一:position说明 position fixed 实现固定在某个位置 正常情况写两个div是在一层中,通过position属性,可以实现分两层和固定,就像在墙上贴了一层纸,就分了两层了. pos ...

  10. 字符串格式化格式 -- Numeric Format Strings