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. DataGridView绑定源码下载

    效果图: 源码下载:http://hovertree.com/h/bjaf/bbot18bj.htm 上面源码不包含数据库的查询,需要获取数据库数据的话,请看这个的源码: http://hovertr ...

  2. 移动端HTML

    display:-webkit-box 把该元素中的所有元素变成块级元素,比如 <ul class="top-nav"> <li>地图</li> ...

  3. JAVA 日期格式工具类DateUtil.java

    DateUtil.java package pers.kangxu.datautils.utils; import java.text.SimpleDateFormat; import java.ut ...

  4. 笔记:xubuntu下如何让系统默认使用nvidia显卡,而不是intel集显

    经反复折腾,得到如下的解决方法: prime-select nvidia 简单吧,但关系是如果让它开机自动执行一次. 反复折腾了xinitrc ,~/.xinitrc , /etc/rc.local ...

  5. 来玩Play框架03 模板

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在上一章节中,我把字符串通过ok()返回给客户.我可以把一个完整的html页面放入 ...

  6. Spring+ibatis动态管理数据源

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...

  7. Scoped CSS规范草案

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped-CSS 写在前面 问:什么是Scoped CSS规范? Scoped CSS规范是We ...

  8. EasyUI+Knockout实现经典表单的查看、编辑

    此文章是基于 1. 搭建SpringMVC+Spring+Hibernate平台 2. 自制xml实现SQL动态参数配置 3. 利用DetachedCriteria构建HQL参数动态匹配 4. 常用日 ...

  9. Android HandlerThread 总结使用

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6062880.html 本文出自[赵彦军的博客] 前言 以前我在 [Android Handler.Loop ...

  10. Xamarin Android Activity全屏的两种方式

    方式一 直接在Activity的Attribute中定义 如下 在 MainActivity 中 [Activity(Label = "app", MainLauncher = t ...