【LG4294】[WC2008]游览计划

题面

洛谷

bzoj

题解

斯坦纳树板子题。

斯坦纳树的总结先留个坑。

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <queue>
  8. using namespace std;
  9. inline int gi() {
  10. register int data = 0, w = 1;
  11. register char ch = 0;
  12. while (!isdigit(ch) && ch != '-') ch = getchar();
  13. if (ch == '-') w = -1, ch = getchar();
  14. while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
  15. return w * data;
  16. }
  17. typedef pair<int, int> P;
  18. typedef pair<P, int> Pi;
  19. #define fi first
  20. #define se second
  21. const int INF = 0x3f3f3f3f;
  22. int N, M, K, rt, f[105][1111], a[105], ans[15][15];
  23. bool inq[105];
  24. Pi pre[105][1111];
  25. const int dx[] = {0, 0, -1, 1} ;
  26. const int dy[] = {1, -1, 0, 0} ;
  27. queue<P> que;
  28. bool check(P x) { return x.fi >= 0 && x.se >= 0 && x.fi < N && x.se < M; }
  29. #define num(u) (u.fi * M + u.se)
  30. void spfa(int o) {
  31. while (!que.empty()) {
  32. P x = que.front(); que.pop(); inq[num(x)] = 0;
  33. for (int i = 0; i < 4; i++) {
  34. P v = make_pair(x.fi + dx[i], x.se + dy[i]);
  35. int nx = num(x), nv = num(v);
  36. if (check(v) && f[nv][o] > f[nx][o] + a[nv]) {
  37. f[nv][o] = f[nx][o] + a[nv];
  38. if (!inq[nv]) inq[nv] = 1, que.push(v);
  39. pre[nv][o] = make_pair(x, o);
  40. }
  41. }
  42. }
  43. }
  44. void dfs(P x, int o) {
  45. if (!pre[num(x)][o].se) return ;
  46. ans[x.fi][x.se] = 1;
  47. int nx = num(x);
  48. if (pre[nx][o].fi == x) dfs(x, o ^ pre[nx][o].se);
  49. dfs(pre[nx][o].fi, pre[nx][o].se);
  50. }
  51. int main () {
  52. #ifndef ONLINE_JUDGE
  53. freopen("cpp.in", "r", stdin);
  54. #endif
  55. cin >> N >> M;
  56. memset(f, 0x3f, sizeof(f));
  57. for (int i = 0, tot = 0; i < N; i++) {
  58. for (int j = 0; j < M; j++) {
  59. cin >> a[tot];
  60. if (!a[tot]) f[tot][1 << (K++)] = 0, rt = tot;
  61. ++tot;
  62. }
  63. }
  64. for (int o = 1; o < (1 << K); o++) {
  65. for (int i = 0; i < N * M; i++) {
  66. for (int s = o & (o - 1); s; s = o & (s - 1))
  67. if (f[i][o] > f[i][s] + f[i][o ^ s] - a[i]) {
  68. f[i][o] = f[i][s] + f[i][o ^ s] - a[i];
  69. pre[i][o] = make_pair(make_pair(i / M, i % M), s);
  70. }
  71. if (f[i][o] < INF) que.push(make_pair(i / M, i % M)), inq[i] = 1;
  72. }
  73. spfa(o);
  74. }
  75. cout << f[rt][(1 << K) - 1] << endl;
  76. dfs(make_pair(rt / M, rt % M), (1 << K) - 1);
  77. for (int i = 0, tot = 0; i < N; i++){
  78. for (int j = 0; j < M; j++)
  79. if (!a[tot++]) putchar('x');
  80. else putchar(ans[i][j] ? 'o' : '_');
  81. printf("\n");
  82. }
  83. return 0;
  84. }

【LG4294】[WC2008]游览计划的更多相关文章

  1. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

  2. [WC2008]游览计划 解题报告

    [WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...

  3. bzoj2595 / P4294 [WC2008]游览计划

    P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...

  4. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

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

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

  6. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

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

  7. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

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

  8. [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树

    游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...

  9. luogu P4294 [WC2008]游览计划

    LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...

随机推荐

  1. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  2. javascript学习2

    上次我们了解到 JavaScript提供了一组以window为核心的对象,实现了对浏览器窗口的访问控制.JavaScript中定义了6种重要的对象: window对象       表示浏览器中打开的窗 ...

  3. array和matrix

    array:数组 matrix:矩阵 list:列表 a = [[1,2,3],[4,5,6]] 两种array的定义方式,第一种方式可以看出list不是array,但却有很大的联系 a = np.a ...

  4. background-clip 实现字体渐变效果

    background-clip 实现字体渐变效果 (一)类似KTV字幕效果 @-webkit-keyframes loop{ 0%{background-position: -800px 0;} 10 ...

  5. sql连接查询INNER JOIN,LEFT JOIN,RIGHT JOIN区别

    测试表 课程表cource 教师表teacher 查询老师教的课程 1.inner join内链接 ,只显示完全匹配的查询结果 SELECT  cource.cname,teacher.tname f ...

  6. everything对已经不存在的文件还进行索引,报错“系统找不到指定的驱动器”

    使用everything时,总是报下面的错.也就是对于已经不存在的文件或者文件夹还保留着对应的索引. 如下图: 这个其实我们在选项中设置一下规则就可以了. 一. 二. 三. ok啦.

  7. OC中的内省(Introspection)方法

    我们在写OC代码的时候经常用到:isKindOfClass: 一类的方法,但是对于它并没有一个了解,这里也是从网上搜索了一些内容,简单介绍并记录一下.这类方法就是属于OC的特性之一:内省. 内省(In ...

  8. ubuntu 安装linux 下vmVMware tools 步骤及问题解决

    一. 菜单栏     “虚拟机” ——> “设置 ”     使用linux.so镜像文件    此文件在vmware workstation 的安装目录.并且打开CD/DVD的连接. 二.终端 ...

  9. 课时6.HTTP协议(理解)

    HTTP是Hypertext Transfer Protocol的缩写,译为:超文本传输协议 什么是协议? 在现实生活中有很多的协议,例如租房协议/买卖协议/离婚协议 无论是什么协议它们都有一个共同点 ...

  10. 树莓3B+_安装vim

    第一步:访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑. sudo apt-get update 第二步:安装vim sudo apt-get install vim 第三步:配置vim ...