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】游览计划的更多相关文章

  1. WC 2008 观光计划(斯坦纳树)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2595 思路 是一道比较裸的斯坦纳树呢- 题意等价于选出包含一些点的最小生成树,这就是斯坦纳树 ...

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

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

  3. 【BZOJ】【2595】【WC2008】游览计划

    Orz zky神犇http://blog.csdn.net/iamzky/article/details/42029921 spfa的灵活应用!(好像是求了一个叫做斯坦纳树的东西……) o(︶︿︶)o ...

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

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

  5. 【LG4294】[WC2008]游览计划

    [LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...

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

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

  7. Windows Server 2008通过计划任务定时执行bat文件

    前段时间在Windows Server 2008安装了一套基于MySQL数据库的软件,处于数据安全的考虑,希望每天能够自动进行数据库备份.我在别人脚本的基础上自己写了一个数据库备份的bat脚本,双击该 ...

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

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

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

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

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

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

随机推荐

  1. C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案

    新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...

  2. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  3. 设计模式-代理模式(Proxy Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...

  4. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  5. [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制

    原文出处: 原文作者:云中岳 原文链接:http://www.cnblogs.com/netlover/archive/2011/07/08/Win7_IIS_Upload.html IS 7 默认文 ...

  6. javascript操作系统检测

    function detectOS() { var sUserAgent = navigator.userAgent;console.log(sUserAgent); var isWin = (nav ...

  7. java编码原理,java编码和解码问题

    java的编码方式原理 java的JVM的缺省编码方式由系统的“本地语言环境”设置确定,和操作系统的类型无关 . 在JAVA源文件-->JAVAC-->Class-->Java--& ...

  8. js的replace函数入参为function时的疑问

    近期在写js导出excel文件时运用到replace方法,此处详细的记录下它各个参数所代表的的意义. 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式 ...

  9. [Erlang 0126] 我们读过的Erlang论文

    我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...

  10. [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...