【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]$为 ...
随机推荐
- 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方
刚上线一个新版本,其中有台电脑打开软件就报[xx的类型初始值设定项引发异常](还好不是一大波电脑,新东西上线就怕哀鸿遍野),如图: 显然是该类型的静态构造函数中抛异常了(红线处就是类名),遂打开该类, ...
- Java概述
Java概述 一.前奏(常见的DOS命令) dir:列出当前目录下的文件以及文件夹 md:创建目录(文件夹) rd:删除目录 cd:进入指定目录 cd..:退出当前目录,返回到上一级目录 cd\:退回 ...
- C#模拟HTTP Form请求上传文件
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...
- IIS7 应用程序池自动回收关闭的解决方案
在ASP.NET Application中加入某个定时任务,那想必一定是用一个线程在不停地做定时计算,在自己的ASP.NET应用程序中加入了Quartz.NET框架 夜间或者网站在经过无访问阶段后,后 ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
- Android 面试题--Service
1.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity ...
- ListView之多种类型Item
一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...
- 【代码笔记】iOS-账号,密码记住
一,效果图. 二,工程图. 三,代码. RegisViewController.h #import <UIKit/UIKit.h> @interface RegisViewControll ...
- IO流的登录与注册
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileR ...
- Express 4 handlebars 不使用layout写法
Express 4 handlebars 不使用layout写法 Express node nodejs handlebars layout 最近刚开始学习使用nodejs. 使用express搭建了 ...