正题

题目链接:https://www.luogu.com.cn/problem/P4294


题目大意

n∗mn*mn∗m的网格,每个格子的修建费用不同,要求修建费用最小连接所有关键点。


解题思路

设fs,i,jf_{s,i,j}fs,i,j​表示目前连接关键点状态为sss,在(i,j)(i,j)(i,j)这个位置时的最小代价,然后同sss的用spfaspfaspfa转移即可。

输出方案记录一下前驱,如果分裂开就分开两个赋值即可。

时间复杂度O(3knm)O(3^knm)O(3knm)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=13,S=1<<13;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m,cnt,a[N][N],g[N][N];
int f[S][N][N],pre[S][N][N];
bool v[N][N],w[N][N];
queue<pair<int,int> >q;
void SPFA(int s){for(int i=1;i<=n;i++)   for(int j=1;j<=m;j++)q.push(mp(i,j)),v[i][j]=1;while(!q.empty()){int x=q.front().first,y=q.front().second;for(int k=0;k<4;k++){int zx=x+dx[k],zy=y+dy[k];if(zx<1||zy<1||zx>n||zy>m)continue;if(f[s][x][y]+a[zx][zy]<f[s][zx][zy]){f[s][zx][zy]=f[s][x][y]+a[zx][zy];pre[s][zx][zy]=-k-1;if(!v[zx][zy])q.push(mp(zx,zy)),v[zx][zy]=1;}}q.pop();v[x][y]=0;}return;
}
void dfs(int s,int x,int y){w[x][y]=1;int z=pre[s][x][y];if(!pre[s][x][y])return;if(z<0)dfs(s,x-dx[-z-1],y-dy[-z-1]);else dfs(z,x,y),dfs(s-z,x,y);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);if(a[i][j]==0)g[i][j]|=(1<<(cnt++));}int MS=(1<<cnt);memset(f,0x3f,sizeof(f));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!a[i][j])f[g[i][j]][i][j]=0;for(int s=0;s<MS;s++){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int l=s;while(l){l=((l-1)&s);if(!l)break;if(max(f[l][i][j],f[s-l][i][j])<1e9)if(f[l][i][j]+f[s-l][i][j]-a[i][j]<f[s][i][j]){f[s][i][j]=f[l][i][j]+f[s-l][i][j]-a[i][j];pre[s][i][j]=l;}}}SPFA(s);}int mx=1,my=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(f[MS-1][i][j]<f[MS-1][mx][my])mx=i,my=j;printf("%d\n",f[MS-1][mx][my]);dfs(MS-1,mx,my);for(int i=1;i<=n;i++,putchar('\n'))for(int j=1;j<=m;j++){if(!a[i][j])putchar('x');else if(w[i][j])putchar('o');else putchar('_');}
}

P4294-[WC2008]游览计划【斯坦纳树】相关推荐

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

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

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

    Description 给一张网格图,有一些点必须选,必选的的店无价值,其余有价值,问把必须点全部连起来的最小代价. Sample Input 4 4 0 1 1 0 2 5 5 1 1 5 5 1 ...

  3. P4294 [WC2008]游览计划

    题目链接 题目描述 从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 NNN 行 MMM 列 ( ...

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

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

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

    [Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...

  6. 业界萌新对斯坦纳树的小结

    业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使 ...

  7. [学习笔记]斯坦纳树

    处理一种这样的问题: 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络 ...

  8. [THUSC2017][斯坦纳树+随机化]巧克力

    题面 [题目描述] "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成 n n n行 m m m列.每一小块都有自己特别的图 ...

  9. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  10. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

最新文章

  1. 【重磅】Waymo无人车高层组团出走?CFO今日也走了!
  2. 升级到12c云数据库的最佳实践
  3. EOS 执行合约报错, CODE: 3090003
  4. 201671010103 2016-2017-2 《Java程序设计》第十二周学习心得
  5. ORA-28000: the account is locked 的解决办法!
  6. Spring Boot + Vue 前后端分离开发,权限管理的一点思路
  7. Java技术:serialVersionUID作用介绍
  8. php内核分析(六)-opcode
  9. 北大学霸:高考有漏洞可钻,学会套路,立马提分,屡试不爽!
  10. 图形的装饰教案计算机,《电脑图案设计师》教案教学设计
  11. [vscode] python debugging
  12. android 过滤ip,EditText Android过滤器的IP地址###。###。###。###?
  13. 装tensorflow未果
  14. 星辰数据空号检测API文档
  15. Python——公司又双叒叕更新通讯录了,利用itchat实现微信速查公司通讯录
  16. 小恐龙游戏制作挑战:第9天-打完大部分计分器模块的代码
  17. 通过AT指令将air202 接入阿里云
  18. 数据增强_炼丹笔记三:数据增强
  19. 奔驰S400商务型升级前排通风座椅系统,夏天必备的功能
  20. 【OpenCV】Lab颜色空间

热门文章

  1. python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...
  2. php smtp验证,php通过smtp验证登陆
  3. doxygen如何生成JAVA文档_有用Doxygen生成文档的吗?发一篇Doxygen的使用文档给大家,从网上搜来的。...
  4. java疯狂讲义内存分配_java疯狂讲义学习:面向对象(上)
  5. java超长字符序列化_String 字符串最长可以有多长?
  6. c语言程序设计黄保和第二章,C语言程序设计答案(黄保和编)第6章
  7. 数据结构——二叉树的层次遍历进阶
  8. 编程中的一种特殊递归-尾递归
  9. C++实现各种选择排序(简单选择排序,堆排序)
  10. C++继承同名静态成员处理