嘟嘟嘟

都说这题是斯坦纳树的板儿题。

斯坦纳树,我也不知道为啥起这么个名儿,斯坦纳树主要用来解决这样一类问题:带边权无向图上有几个(一般约10个)点是【关键点】,要求选择一些边使这些点在同一个联通块内,同时要求所选的边的边权和最小。(摘自兔哥博客)
但说白了就是一种状压dp。令\(dp[i][j][S]\)表示和点\((i, j)\)相连的关键点的状态为\(S\)时的最小代价,于是有两个转移方程:
\[\begin{align*} dp[i][j][S] &= min_{k \in S} \{ dp[i][j][k] + dp[i][j][\complement_kS] - a[i][j] \} \\ dp[i][j][S] &= min \{ dp[x][y][S] + a[i][j] \} \end{align*}\]
第一个方程很好转移;第二个方程必须满足\((i, j)\)和\((x, y)\)相邻,这个用刷表法就不行了,但是可以用类似spfa的方法转移!

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<queue>
#include<assert.h>
#include<ctime>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
#define forE(i, x, y) for(int i = head[x], y; ~i && (y = e[i].to); i = e[i].nxt)
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 12;
inline ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans;
}
inline void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}
In void MYFILE()
{
#ifndef mrclrfreopen("ha.in", "r", stdin);freopen("ha.out", "w", stdout);
#endif
}int n, m, N, a[maxn][maxn], cnt = 0;struct Node {int x, y, S;} pre[maxn][maxn][1 << maxn];
int dp[maxn][maxn][1 << maxn];#define pr pair<int, int>
#define mp make_pair
#define fir first
#define sec second
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
bool in[maxn][maxn];
queue<pr> q;
In void spfa(int S)
{while(!q.empty()){int x = q.front().fir, y = q.front().sec;q.pop(); in[x][y] = 0;for(int i = 0; i < 4; ++i){int nx = x + dx[i], ny = y + dy[i];if(nx <= 0 || nx > n || ny <= 0 || ny > m) continue;if(dp[nx][ny][S] > dp[x][y][S] + a[nx][ny]){dp[nx][ny][S] = dp[x][y][S] + a[nx][ny];pre[nx][ny][S] = (Node){x, y, S};if(!in[nx][ny]) q.push(mp(nx, ny)), in[nx][ny] = 1;}}}
}bool vis[maxn][maxn];
In void dfs(int x, int y, int S)
{vis[x][y] = 1; Node tp = pre[x][y][S];if(!tp.x) return;dfs(tp.x, tp.y, tp.S);if(tp.x == x && tp.y == y) dfs(tp.x, tp.y, S ^ tp.S);
}int main()
{
//  MYFILE();n = read(), m = read();Mem(dp, 0x3f);for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){a[i][j] = read();if(!a[i][j]) dp[i][j][1 << (cnt++)] = 0;}N = 1 << cnt;for(int S = 0; S < N; ++S){for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){for(int k = S, tp; k; k = S & (k - 1))if(dp[i][j][S] > (tp = dp[i][j][S ^ k] + dp[i][j][k] - a[i][j])){dp[i][j][S] = tp;pre[i][j][S] = (Node){i, j, k};}if(dp[i][j][S] ^ INF) q.push(mp(i, j)), in[i][j] = 1;}spfa(S);}int x, y, ans = INF;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j) if(dp[i][j][N - 1] < ans) ans = dp[i][j][N - 1], x = i, y = j;write(ans), enter;dfs(x, y, (1 << cnt) - 1);for(int i = 1; i <= n; ++i, enter)for(int j = 1; j <= m; ++j){if(!a[i][j]) putchar('x');else putchar(vis[i][j] ? 'o' : '_');}return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10783989.html

[WC2008]游览计划相关推荐

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

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

  2. P4294 [WC2008]游览计划

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

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

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

  4. bzoj2595 [Wc2008]游览计划

    题目描述 题解: 这道题是斯坦纳树的典型例题. 首先看一眼数据范围发现$10$的范围不状压对不起出题人,然后考虑转移. 设$f[i][j][s]$表示当前在点$(i,j)$,覆盖特殊节点状态为$s$的 ...

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

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

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

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

  7. LCP 16. 游乐园的游览计划

    LCP 16. 游乐园的游览计划 题目 又到了一年一度的春游时间,小吴计划去游乐场游玩 1 天,游乐场总共有 N 个游乐项目,编号从 0 到 N-1.小吴给每个游乐项目定义了一个非负整数值 value ...

  8. 蓝桥杯 游览计划 (Python实现)

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧. 八云紫(咦这是怎么中枪的?)从起点 ...

  9. 试题 算法提高 游览计划

    资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千 ...

最新文章

  1. Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
  2. iOS彩票项目--第三天,搭建竞技场和发现,搭建幸运选号和我的彩票界面
  3. 基于MM32F3273的MicroPython实验电路板 - 工作并不是正常
  4. spring 定时器任务深入理解
  5. 第15章 进程间通行 15.6 XSI IPC 15.7 消息队列
  6. 论文笔记 Bayesian Probabilistic Matrix Factorizationusing Markov Chain Monte Carlo (ICML 2008)
  7. 分布式系统——网络监视系统zabbix3.4.2,以及向zabbix中添加被监视主机(一)
  8. B+树(加强版多路平衡查找树)
  9. 本机连接opc server有部分数据不刷新_实时数据库PI在企业MES系统中的应用
  10. 稳妥圣诞节海报设计模板|节日怎可辜负美食
  11. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP
  12. 进程分配之交叉分配法
  13. YYKit是个好东西-YYLabel实现一个文本多个点击事件
  14. tcpclient java_[Java] 网络-01 TCPClient / TCPServer
  15. java excel转pdf linux_docker安装libreoffice并实现把Excel转为pdf
  16. 人生八境——古诗词中读懂人生境界
  17. Oracle数据库,创建表并给表、字段添加注释.
  18. C语言中的%f和%lf的区别
  19. [CF1284G]Seollal
  20. bno055传感器数据不更新_博世传感器BNO055智能9轴 的绝对方向传感器

热门文章

  1. iif在mysql能用不_在写SQL语句时,你们会经常用IIF(ISNULL(字段))吗
  2. 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
  3. Verilog 实现千兆网UDP协议 基于88E1111--板级验证--增加ARP
  4. 白色/黄色/开关型/罗丹明B染料标记希夫碱/半胱氨酸乙酯荧光探针的制备过程
  5. 爱普生发布特殊3D眼镜:内建Google专门开发的安卓系统
  6. win10 java模拟鼠标_[pc玩家]如何在Windows10中用键盘控制鼠标光标
  7. 面试问到这个我直接蒙了,你呢?
  8. 2023秋招大厂经典面试题及答案整理归纳(141-160)校招必看
  9. Flyme应用中心应用认领
  10. PHP GD库 生成图片水印