题目链接

差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复。

题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=+,inf=0x3f3f3f3f;
  5. const int dx[]= {,,-,};
  6. const int dy[]= {-,,,};
  7. int n,m,k,dp[<<][N][N],a[N][N],inq[N][N];
  8. char s[N][N];
  9. struct D {int x,y;} X[N];
  10. struct Ans {int S,x,y;} ansS,nxt[<<][N][N];
  11. queue<D> q;
  12. void upd(int x,int y,int c,int S,int x2,int y2) {
  13. if(dp[S][x][y]>c) {
  14. dp[S][x][y]=c;
  15. nxt[S][x][y]= {S,x2,y2};
  16. if(!inq[x][y])inq[x][y]=,q.push({x,y});
  17. }
  18. }
  19. void spfa(int S) {
  20. while(q.size())q.pop();
  21. memset(inq,,sizeof inq);
  22. for(int i=; i<=n; ++i)
  23. for(int j=; j<=m; ++j)
  24. if(dp[S][i][j]!=inf)inq[i][j]=,q.push({i,j});
  25. while(q.size()) {
  26. int x=q.front().x,y=q.front().y;
  27. q.pop(),inq[x][y]=;
  28. for(int i=; i<; ++i) {
  29. int x2=x+dx[i],y2=y+dy[i];
  30. if(x2<||x2>n||y2<||y2>m)continue;
  31. upd(x2,y2,dp[S][x][y]+a[x2][y2],S,x,y);
  32. }
  33. }
  34. }
  35. void dfs(int S,int x,int y) {
  36. if(!a[x][y])s[x][y]='x';
  37. else s[x][y]='o';
  38. int S2=nxt[S][x][y].S,x2=nxt[S][x][y].x,y2=nxt[S][x][y].y;
  39. if(!S2)return;
  40. else if(S2==S)dfs(S2,x2,y2);
  41. else dfs(S2,x2,y2),dfs(S^S2,x2,y2);
  42. }
  43. int main() {
  44. scanf("%d%d",&n,&m);
  45. for(int i=; i<=n; ++i)
  46. for(int j=; j<=m; ++j) {
  47. scanf("%d",&a[i][j]);
  48. if(!a[i][j])X[k++]= {i,j};
  49. }
  50. memset(dp,inf,sizeof dp);
  51. for(int i=; i<k; ++i)dp[<<i][X[i].x][X[i].y]=a[X[i].x][X[i].y];
  52. for(int S=; S<(<<k); ++S) {
  53. for(int S2=(S-)&S; S2; S2=(S2-)&S)
  54. for(int i=; i<=n; ++i)
  55. for(int j=; j<=m; ++j) {
  56. dp[S][i][j]=min(dp[S][i][j],dp[S2][i][j]+dp[S^S2][i][j]-a[i][j]);
  57. if(dp[S][i][j]==dp[S2][i][j]+dp[S^S2][i][j]-a[i][j])nxt[S][i][j]= {S2,i,j};
  58. }
  59. spfa(S);
  60. }
  61. int ans=inf;
  62. for(int i=; i<=n; ++i)
  63. for(int j=; j<=m; ++j) {
  64. ans=min(ans,dp[(<<k)-][i][j]);
  65. if(ans==dp[(<<k)-][i][j])ansS= {(<<k)-,i,j};
  66. }
  67. for(int i=; i<=n; ++i)
  68. for(int j=; j<=m; ++j)s[i][j]='_';
  69. dfs(ansS.S,ansS.x,ansS.y);
  70. printf("%d\n",ans);
  71. for(int i=; i<=n; ++i) {
  72. for(int j=; j<=m; ++j)putchar(s[i][j]);
  73. puts("");
  74. }
  75. return ;
  76. }

P4294 [WC2008]游览计划 (斯坦纳树)的更多相关文章

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

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

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

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

  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. 洛谷4294 [WC2008]游览计划——斯坦纳树

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

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

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

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

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

随机推荐

  1. Tei-Wei Kuo

    一. A Commitment-based Management Strategy for the Performance and Reliability Enhancement of Flash-m ...

  2. redis 慢查询、Pipeline

    1.慢查询 简介 慢查询顾名思义是将redis执行命令较慢的命令记录下来,redis处理慢查询时是将慢查询记录到慢查询队列中 慢查询配置 slowlog-max-len 慢查询队列长度(记录多少条慢查 ...

  3. spring boot 使用elasticsearch

    在文章开始之前我们先来介绍一下elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎. 查询 : Elasticsearch 允许执行和合并多种类型的搜索 — 结构化.非 ...

  4. python+pycharm+PyQt5 图形化界面安装教程

    python图形化界面安装教程 配置环境变量 主目录 pip所在目录,及script目录 更新pip(可选) python -m pip install --upgrade pip ps:更新出错一般 ...

  5. GCD和LCM

    GCD _ LCM 是给你两个数A B 的最大公约数, 以及最小公倍数 the greatest common divisor and the least common multiply ! 最大公约 ...

  6. POJ2367(拓扑排序裸题

    #include<iostream> #include<vector> #include<queue> using namespace std; typedef l ...

  7. django进阶版2

    目录 批量插入数据 自定义分页器 创建多表关系的3种方法 全自动 全手动 半自动 form组件 如何渲染页面 第一种方式 第二种方式 第三种方式 如何显示错误信息 forms组件钩子函数 局部钩子 全 ...

  8. Codeforces 1239A. Ivan the Fool and the Probability Theory

    传送门 注意到连续两个格子如果有相同颜色那么一路过去的都可以确定 比如一开始染了这两个位置: 然后发现后面整片过去都可以确定: 对于横着的情况也是一样,然后就会发现不可能出现横着两个和竖着两个同时都有 ...

  9. js对象的 两种访问方式

    来对象访问属性有两种方式.有一个对象Obj = {"Name":"Langshen","AGE":"28"} 用点访问, ...

  10. B2C电商平台开发心得(asp.net+bootstrap)

    Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 html.css.javascript的,专为 web 应用设计,包含了移动设备优先的样式, 其响应式 ...