【LG4294】[WC2008]游览计划

题面

洛谷

bzoj

题解

斯坦纳树板子题。

斯坦纳树的总结先留个坑。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
typedef pair<int, int> P;
typedef pair<P, int> Pi;
#define fi first
#define se second
const int INF = 0x3f3f3f3f;
int N, M, K, rt, f[105][1111], a[105], ans[15][15];
bool inq[105];
Pi pre[105][1111];
const int dx[] = {0, 0, -1, 1} ;
const int dy[] = {1, -1, 0, 0} ;
queue<P> que;
bool check(P x) { return x.fi >= 0 && x.se >= 0 && x.fi < N && x.se < M; }
#define num(u) (u.fi * M + u.se)
void spfa(int o) {
while (!que.empty()) {
P x = que.front(); que.pop(); inq[num(x)] = 0;
for (int i = 0; i < 4; i++) {
P v = make_pair(x.fi + dx[i], x.se + dy[i]);
int nx = num(x), nv = num(v);
if (check(v) && f[nv][o] > f[nx][o] + a[nv]) {
f[nv][o] = f[nx][o] + a[nv];
if (!inq[nv]) inq[nv] = 1, que.push(v);
pre[nv][o] = make_pair(x, o);
}
}
}
}
void dfs(P x, int o) {
if (!pre[num(x)][o].se) return ;
ans[x.fi][x.se] = 1;
int nx = num(x);
if (pre[nx][o].fi == x) dfs(x, o ^ pre[nx][o].se);
dfs(pre[nx][o].fi, pre[nx][o].se);
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
cin >> N >> M;
memset(f, 0x3f, sizeof(f));
for (int i = 0, tot = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> a[tot];
if (!a[tot]) f[tot][1 << (K++)] = 0, rt = tot;
++tot;
}
}
for (int o = 1; o < (1 << K); o++) {
for (int i = 0; i < N * M; i++) {
for (int s = o & (o - 1); s; s = o & (s - 1))
if (f[i][o] > f[i][s] + f[i][o ^ s] - a[i]) {
f[i][o] = f[i][s] + f[i][o ^ s] - a[i];
pre[i][o] = make_pair(make_pair(i / M, i % M), s);
}
if (f[i][o] < INF) que.push(make_pair(i / M, i % M)), inq[i] = 1;
}
spfa(o);
}
cout << f[rt][(1 << K) - 1] << endl;
dfs(make_pair(rt / M, rt % M), (1 << K) - 1);
for (int i = 0, tot = 0; i < N; i++){
for (int j = 0; j < M; j++)
if (!a[tot++]) putchar('x');
else putchar(ans[i][j] ? 'o' : '_');
printf("\n");
}
return 0;
}

【LG4294】[WC2008]游览计划的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

  5. 【BZOJ2595】[Wc2008]游览计划 斯坦纳树

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

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

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

  7. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

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

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

  9. luogu P4294 [WC2008]游览计划

    LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...

随机推荐

  1. 【OpenCV】三种方式操作图像像素

    OpenCV中,有3种访问每个像素的方法:使用at方法.使用迭代器方法.使用指针 运行如下程序后可以发现使用at方法速度最快. 代码如下: //操作图像像素 #include <opencv2/ ...

  2. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  3. 【[SCOI2013]摩托车交易 】

    倍增什么的最慢了,常数太大了 我们可以上树剖啊 但是如果用树剖来查询树上两点之间的最小边权的话,可能只能在上一棵线段树? 那也太\(naive\)了,尽管倍增常数大,但是还是比两个\(log\)快的 ...

  4. UVA10125 Sumsets

    嘟嘟嘟 很简单的折半搜索. 把式子变一下型,得到\(a + b = d - c\). 然后枚举\(a, b\),存到\(map\)里,再枚举\(c, d\)就好了. \(map\)以\(a,b\)两数 ...

  5. programming-languages学习笔记--第3部分

    programming-languages学习笔记–第3部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...

  6. Vue动态实现评分效果

    1.图片分为三种 on:half:  off <style> .star{ font-size: 0; } .star-item{ display: inline-block; backg ...

  7. Kali-linux查看打开的端口

    对一个大范围的网络或活跃的主机进行渗透测试,必须要了解这些主机上所打开的端口号.在Kali Linux中默认提供了Nmap和Zenmap两个扫描端口工具.为了访问目标系统中打开的TCP和UDP端口,本 ...

  8. 修改jupyter notebook的默认路径

    我的系统环境是win10,安装了anaconda3 for python 3.6.6首先需要配置notebook的变量环境:打开 cmd 输入命令 jupyter notebook --generat ...

  9. Annotation原理

    为什么使用注解: 1.通过注解,可保存源数据在Java源代码中:并且注解不同于注释,注解享有编译期的类型检查保护. 2.可在描述符性质的类或接口中抽取重复性的工作,通过注解来简化与自动化这些工作. 注 ...

  10. java工作流引擎 Activiti6.0 websocket 即时聊天发图片文字 好友群组 SSM源码

    时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 工作流模块--------------------------------------------------------- ...