题目:https://www.luogu.org/problemnew/show/P4294

大概是状压。两种转移,一个是以同一个点为中心,S由自己的子集拼起来;一个是S相同、中心不同的同层转移。

注意S由自己的子集拼起来的时候要减去一倍的自己位置的代价。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. int rdn()
  7. {
  8. int ret=;bool fx=;char ch=getchar();
  9. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  10. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  11. return fx?ret:-ret;
  12. }
  13. int Mn(int a,int b){return a<b?a:b;}
  14. const int N=,M=(<<)+,K=,INF=N*(<<);
  15. int n,m,tot,bh[K][K],x[N],y[N],w[N],dp[N][M],bin[K];
  16. queue<int> q; bool ins[N]; int to[N][M][][];
  17. char ch[K][K];
  18. void cz(int k,int d,int s)
  19. {
  20. dp[d][s]=dp[k][s]+w[d];
  21. to[d][s][][]=k;to[d][s][][]=s;to[d][s][][]=to[d][s][][]=;
  22. if(!ins[d])q.push(d),ins[d]=;
  23. }
  24. void spfa(int s)
  25. {
  26. for(int i=;i<=tot;i++)
  27. q.push(i),ins[i]=;
  28. while(q.size())
  29. {
  30. int k=q.front(),d;q.pop();ins[k]=;
  31. if(x[k]>&&dp[d=bh[x[k]-][y[k]]][s]>dp[k][s]+w[d])cz(k,d,s);
  32. if(x[k]<n&&dp[d=bh[x[k]+][y[k]]][s]>dp[k][s]+w[d])cz(k,d,s);
  33. if(y[k]>&&dp[d=bh[x[k]][y[k]-]][s]>dp[k][s]+w[d])cz(k,d,s);
  34. if(y[k]<m&&dp[d=bh[x[k]][y[k]+]][s]>dp[k][s]+w[d])cz(k,d,s);
  35. }
  36. }
  37. void solve(int cr,int s)
  38. {
  39. ch[x[cr]][y[cr]]='o';
  40. if(to[cr][s][][])solve(to[cr][s][][],to[cr][s][][]);
  41. if(to[cr][s][][])solve(to[cr][s][][],to[cr][s][][]);
  42. }
  43. int main()
  44. {
  45. n=rdn();m=rdn();int cnt=;bin[]=;
  46. memset(dp,0x3f,sizeof dp);
  47. for(int i=;i<=n;i++)
  48. for(int j=;j<=m;j++)
  49. {
  50. bh[i][j]=++tot;w[tot]=rdn();
  51. x[tot]=i; y[tot]=j;
  52. if(w[tot])continue; cnt++; bin[cnt]=bin[cnt-]<<;
  53. dp[tot][bin[cnt-]]=;
  54. }
  55. for(int s=;s<bin[cnt];s++)
  56. {
  57. for(int i=;i<=tot;i++)
  58. for(int d=(s-)&s;d;d=(d-)&s)
  59. if(dp[i][d]+dp[i][s^d]-w[i]<dp[i][s])//-w[i]!
  60. {
  61. dp[i][s]=dp[i][d]+dp[i][s^d]-w[i];
  62. to[i][s][][]=to[i][s][][]=i;
  63. to[i][s][][]=d; to[i][s][][]=s^d;
  64. }
  65. spfa(s);
  66. }
  67. int ans=INF,cr[]={,bin[cnt]-};
  68. for(int i=;i<=tot;i++)
  69. if(dp[i][bin[cnt]-]<ans)ans=dp[i][bin[cnt]-],cr[]=i;
  70. solve(cr[],cr[]);
  71. printf("%d\n",ans);
  72. for(int i=;i<=n;i++,puts(""))
  73. for(int j=;j<=m;j++)
  74. if(!w[bh[i][j]])putchar('x');
  75. else if(ch[i][j]=='o')putchar('o');
  76. else putchar('_');
  77. return ;
  78. }

洛谷4294 [WC2008]游览计划——斯坦纳树的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

    洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...

  9. 【BZOJ-2595】游览计划 斯坦纳树

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1518  Solved: 7 ...

随机推荐

  1. 20145204 《Java程序设计》第四周学习总结

    20145204 <Java程序设计>第四周学习总结 教材学习内容总结 继承 什么时候使用继承? 当多个类中出现重复定义的行为(即多个类中出现重复的代码)时,就把相同的程序代码提成为父类. ...

  2. Linux内核源码目录说明

    Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系.下面是对每一个目录的简单描述. ...

  3. (Matlab)GPU计算简介,及其与CPU计算性能的比较

    1.GPU与CPU结构上的对比 2.GPU能加速我的应用程序吗? 3.GPU与CPU在计算效率上的对比 4.利用Matlab进行GPU计算的一般流程 5.GPU计算的硬件.软件配置 5.1 硬件及驱动 ...

  4. Template Method(模板方法)

    意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 适用性: 一次性实现一个算法的不变的部分, ...

  5. SpringBoot在启动时的多环境配置以及加载顺序

    通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...

  6. Java之试题

    1.面向对象编程的三大特性是什么? 2.String 和StringBuffer的区别 3.说出ArrayList,Vector, LinkedList的存储性能和特性 4.Collection 和 ...

  7. 桌面以及任务栏的所有浏览器,被加上了 hao.360.cn的网址

    桌面以及任务栏的所有浏览器,被加上了hao.360.cn的网址 也不知道是安装了什么软件,中了360的招. 桌面以及任务栏的所有浏览器,被加上了hao.360.cn的网址. 这种东西,肯定是该死的36 ...

  8. Spring MVC文件上传教程 commons-io/commons-uploadfile

    Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...

  9. windows电脑使用技巧及常用CMD

    管理用户和组 win+R,输入 compmgmt.msc 本地用户和组->用户 本地安全策略 win+R,输入 secpol.msc 本地策略->安全选项,启用禁止空密码登录如下图,可以防 ...

  10. 有效二叉查找树判断(java实现)

    leetcode 原题 :(即判断二叉树是否为二叉查找树) Given a binary tree, determine if it is a valid binary search tree (BS ...