LINK:游览计划

斯坦纳树例题。

斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树。

也就是说 求最小生成树 但是 并不是整张图 仅限于K个点。

可以发现我们利用克鲁斯卡尔或者prim算法 求的都是整张图的最小生成树。

所以可以发现 这个斯坦纳树问题 其实是一个np困难问题 不存在多项式的时间复杂度。

可以考虑搜索或者状压了。

这道题共有100个点 其中有10个关键点 我们首选状压dp.

有状态 f[i][j][k]表示到了(i,j)这个点了 所经过的点集为k的最小代价。

可以发现我们的i,j 这个点可以先往左再往右走 什么的所以有一个比较显然的转移。

f[i][j][k]=min{f[i][j][s]+f[i][j][s^k]-val[i][j]};

还有一个转移 如果当前点 跑到其他地方了f[x][y][k]=min{f[i][j][k]+val[x][y]};

两个转移就完了。其中第一个状态转移方程 我们可以直接枚举子集来做。

第二个考虑跑spfa来进行迭代dp.

可以发现是可以跑dij 可能dij在稀疏图中并不优秀?我觉着没有spfa快。

  1. const int MAXN=11;
  2. int n,m,cnt,l,r;
  3. int f[MAXN][MAXN][1<<10];
  4. int a[MAXN][MAXN],vis[MAXN][MAXN];
  5. pii pre[MAXN][MAXN][1<<10];
  6. pii q[10010];
  7. int dx[5]={0,0,0,1,-1};
  8. int dy[5]={0,1,-1,0,0};
  9. inline void spfa(int s)
  10. {
  11. while(++l<=r)
  12. {
  13. pii w=q[l];vis[w.F][w.S]=0;
  14. rep(1,4,i)
  15. {
  16. int xx=w.F+dx[i];
  17. int yy=w.S+dy[i];
  18. if(xx<1||yy<1||xx>n||yy>m)continue;
  19. if(f[xx][yy][s]>f[w.F][w.S][s]+a[xx][yy])
  20. {
  21. f[xx][yy][s]=f[w.F][w.S][s]+a[xx][yy];
  22. pre[xx][yy][s]=w;
  23. if(!vis[xx][yy])vis[xx][yy]=1,q[++r]=mk(xx,yy);
  24. }
  25. }
  26. }
  27. }
  28. inline void get_path(int x,int y,int s)
  29. {
  30. vis[x][y]=1;
  31. pii w=pre[x][y][s];
  32. if(!w.F&&!w.S)return;
  33. if(!w.F)get_path(x,y,w.S),get_path(x,y,w.S^s);
  34. else get_path(w.F,w.S,s);
  35. }
  36. int main()
  37. {
  38. freopen("1.in","r",stdin);
  39. memset(f,0x3f,sizeof(f));
  40. get(n);get(m);int s1,s2;
  41. rep(1,n,i)rep(1,m,j)
  42. {
  43. get(a[i][j]);
  44. if(!a[i][j])s1=i,s2=j,++cnt,f[i][j][1<<(cnt-1)]=0;
  45. }
  46. int maxx=(1<<cnt)-1;
  47. rep(1,maxx,i)
  48. {
  49. l=r=0;
  50. for(int x=1;x<=n;++x)
  51. for(int y=1;y<=m;++y)
  52. {
  53. for(int s=i;s;s=i&(s-1))
  54. if(f[x][y][s]+f[x][y][s^i]-a[x][y]<f[x][y][i])
  55. f[x][y][i]=f[x][y][s]+f[x][y][s^i]-a[x][y],pre[x][y][i]=mk(0,s);
  56. if(f[x][y][i]<INF)
  57. {
  58. q[++r]=mk(x,y);
  59. vis[x][y]=1;
  60. }
  61. }
  62. spfa(i);
  63. }
  64. put(f[s1][s2][maxx]);
  65. get_path(s1,s2,maxx);
  66. rep(1,n,i)
  67. {
  68. rep(1,m,j)
  69. {
  70. if(!a[i][j])putchar('x');
  71. else putchar(vis[i][j]?'o':'_');
  72. }
  73. puts("");
  74. }
  75. return 0;
  76. }

luogu P4294 [WC2008]游览计划的更多相关文章

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

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

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

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

  3. 洛谷 P4294 [WC2008]游览计划

    题目链接 不是很会呢,但似乎抄了题解后有点明白了 sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为 ...

  4. P4294 [WC2008]游览计划

    传送门 斯坦纳树 给一个联通图,求 $k$ 个关键点联通的最小生成树权值 设 $f[o][i]$ 表示当前关键点选择状态为 $o$ ,以点 $i$ 为根的树的最小权值 初始 $f[1<<( ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. css盒子模型的深入理解,在块级、行内元素的区别和特性

    css盒子模型用于处理元素的内容.内边距.边框和外边距的方式简称.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的 ...

  2. APP开发---后台设计

    想了好久才准备写博客的,希望能对我自己和大家都有帮助! 话不多说,直接正题! ------------------------------------------------------------- ...

  3. 接口测试基础——fiddler抓包常见问题

    fiddler抓包工作原理: 以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,过程如下:web代理就是在客户端和服务器之间设置一道关卡,客户端先将请求数据 ...

  4. Python 列表生成式 生成器

    [x for x in os.listdir("F:\XXX")] 生成器(x * x for x in range(10)) 如果列表元素按照某种算法推算出来,那我们就可以在循环 ...

  5. JVM 专题六:运行时数据区(一)概述

    1. 运行时数据区架构图 2. 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略, ...

  6. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  7. Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)

    这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式   给你一个字符串 date ,它的格式为 Day Month Yea ...

  8. Spring Bean前置后置处理器的使用

    Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...

  9. 洛谷 P1080 国王游戏 题解

    原题 传送门 思路 分析 我们先假设队伍如下: People left hand right hand Before \(S_a\) A \(a_1\) \(b_1\) B \(a_2\) \(b_2 ...

  10. 题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】

    可以分别枚举两人正面朝上的次数来统计答案,所求即为 \[\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \] 将\(i\ ...