【BZOJ 2595】【WC 2008】游览计划
http://www.lydsy.com/JudgeOnline/problem.php?id=2595
斯坦纳树的例题诶。。。我怎么做了好长时间_(:з」∠)_
首先这是一棵树。
状压表示状态,\(f(i,j,s)\)表示连通的景点的状态为s,i和j为树根的最小值。
转移时先在当前状态s上枚举s的子集t,用子集来转移\(f(i,j,s)=min\{f(i,j,t)+f(i,j,\complement_st)-a(i,j)\},t\varsubsetneqq s,t\neq\varnothing\)
顺便把所有可以用来更新的状态加入队列,然后在当前枚举这层枚举的s内做spfa,求出其他点的f值。
因为最优解一定可以通过两个没有重叠方块的连通块合并,所以不用担心求出的解会有方块被算多次。
时间复杂度\(O(2^kn^2m^2)\)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mk(x, y, z) ((x) + (y) * 100 + (z) * 10000)
using namespace std;
int a[13][13], f[13][13][1 << 10], pre[13][13][1 << 10], n, m, q[1000003], head, tail, inf, tot = 0, ans = 0x7fffffff;
bool inq[10003], mark[13][13];
const int dx[4] = {0, -1, 0, 1};
const int dy[4] = {1, 0, -1, 0};
void spfa(int s) {
int u, x, y, tx, ty, t;
while (head != tail) {
++head; if (head == 1000003) head = 0;
u = q[head]; inq[u] = false;
x = u % 100; y = u / 100;
for (int i = 0; i < 4; ++i) {
tx = x + dx[i]; ty = y + dy[i];
if (tx < 1 || tx > n || ty < 1 || ty > m) continue;
t = f[x][y][s] + a[tx][ty];
if (t < f[tx][ty][s]) {
f[tx][ty][s] = t;
pre[tx][ty][s] = mk(x, y, s);
u = mk(tx, ty, 0);
if (!inq[u]) {
inq[u] = true;
++tail; if (tail == 1000003) tail = 0;
q[tail] = u;
}
}
}
}
}
void dfs(int x, int y, int s) {
mark[x][y] = true;
int num = pre[x][y][s]; if (num == 0) return;
if (num / 10000 == s)
dfs(num % 100, num / 100 % 100, s);
else {
dfs(x, y, num / 10000);
dfs(x, y, s ^ (num / 10000));
}
}
void ouit(int totnum) {
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (f[i][j][totnum] == ans) {
dfs(i, j, totnum);
return;
}
}
int main() {
scanf("%d%d", &n, &m);
memset(f, 60, sizeof(f)); inf = f[0][0][0];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
scanf("%d", &a[i][j]);
if (!a[i][j]) {
f[i][j][1 << tot] = 0;
++tot;
}
}
int totnum = (1 << tot) - 1, now;
for (int s = 1; s <= totnum; ++s) {
head = tail = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
for (int t = s & (s - 1); t; t = s & (t - 1)) {
now = f[i][j][t] + f[i][j][s ^ t] - a[i][j];
if (now < f[i][j][s]) {
f[i][j][s] = now;
pre[i][j][s] = mk(i, j, t);
}
}
if (f[i][j][s] != inf)
inq[q[++tail] = mk(i, j, 0)] = true;
}
spfa(s);
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
ans = min(ans, f[i][j][totnum]);
printf("%d\n", ans);
ouit(totnum);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j)
if (mark[i][j]) putchar(a[i][j] ? 'o' : 'x');
else putchar('_');
puts("");
}
return 0;
}
【BZOJ 2595】【WC 2008】游览计划的更多相关文章
- WC 2008 观光计划(斯坦纳树)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2595 思路 是一道比较裸的斯坦纳树呢- 题意等价于选出包含一些点的最小生成树,这就是斯坦纳树 ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- 【BZOJ】【2595】【WC2008】游览计划
Orz zky神犇http://blog.csdn.net/iamzky/article/details/42029921 spfa的灵活应用!(好像是求了一个叫做斯坦纳树的东西……) o(︶︿︶)o ...
- 【BZOJ-2595】游览计划 斯坦纳树
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1518 Solved: 7 ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- Windows Server 2008通过计划任务定时执行bat文件
前段时间在Windows Server 2008安装了一套基于MySQL数据库的软件,处于数据安全的考虑,希望每天能够自动进行数据库备份.我在别人脚本的基础上自己写了一个数据库备份的bat脚本,双击该 ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
随机推荐
- js正则表达式校验非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用VS2015进行C++开发的6个主要原因
使用VS2015进行C++开发的6个主要原因 使用Visual Studio 2015进行C++开发 在今天的 Build 大会上,进行了“将你的 C++ 代码转移至 VS2015 的 6 个原因”的 ...
- 【Java每日一题】20161229
package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1229 { public s ...
- 一些简单的C语言算法
1. 要求输入一个正整数,打印下述图形 输入:5 输出: * ** *** **** ***** 实现代码如下: #include <stdio.h> int main(int argc, ...
- smarty模块引擎
- ASP.NET CORE配置信息
做个笔记,原文链接 除了应用 IOptions<T> .Value的方式对配置信息进行全局注册外可以应用的另一个微软给出的组件,需要依赖两个包 Microsoft.Extensions.C ...
- mysql binlog_row_image的选择
其含义为 The default value is full. In MySQL 5.5 and earlier, full row images are always used for both b ...
- 【项目管理】图解GitHub基本操作
一.注册并登陆到github网站 1.1.打开github网站首页(https://github.com/) 1.2.注册一个自己的github账号 创建账户后再验证自己的邮箱,然后就可以登陆到git ...
- SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...
- 关于WCF测试时出现无法从***获取元数据问题
在我们已经创建成功一个WCF服务后,通过本机localhost访问和测试均没有任何问题.但是寄宿在IIS/其他平台下时便会出现以下的错误信息 1.使用WCF Test Client错误 2.通过C#引 ...