【LG4294】[WC2008]游览计划
【LG4294】[WC2008]游览计划
题面
题解
斯坦纳树板子题。
斯坦纳树的总结先留个坑。
代码
#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]游览计划的更多相关文章
- 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]$为 ...
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- luogu P4294 [WC2008]游览计划
LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...
随机推荐
- Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用 ...
- 从 Swift 中的序列到类型擦除
如果有这样的一个需求,我希望能像数组一样,用 for 循环遍历一个类或结构体中的所有属性.就像下面这样: let persion = Persion() for i in persion { prin ...
- python3通过qq邮箱发送邮件
python3通过qq邮箱发送邮件 0.了解qq邮箱的SMTP QQ邮箱 POP3 和 SMTP 服务器地址设置如下: 邮箱 POP3服务器(端口995) SMTP服务器(端口465或587) qq. ...
- 新版剑指offer14 剪绳子
int maxProduct(int length){ ) ; ) ; ) ; ; == ) numof3 -= ; )/; ,numof3))*(,numof2)); }
- 人人开源之renren-security
renren-security,从这周开始我将要对其比较详细的研究,之前的研究只不过是比较浅的.正如在这篇文章读读<编写高质量代码:改善Java程序的151条建议>中说过不要重复造轮子. ...
- (转)进程process和线程thread的关系
写的很好很明白cpu每次只能执行一个进程,所以其他进程会挂起 在一个进程中,允许存在n个线程,n个线程共享这个进程中的资源 多个线程在共享的时候存在资源互斥,一次只能一个线程,会需要加锁 一次存在固定 ...
- linux挂在新硬盘
login as: rootroot@192.168.109.128's password:Last login: Fri Mar 22 14:12:08 2019 from 192.168.109. ...
- Xcode 5.1安装插件:规范凝视生成器VVDocumenter
类似java的多行凝视! 安装过程: 1.前往GitHub下载project文件:VVDocumenter-Xcode 2.用Xcode打开project,Command + B Build成功后,能 ...
- SQL中的CONVERT();cast()函数
SQLSERVER中CONVERT函数格式: CAST (expression AS data_type) 参数说明: expression:任何有效的SQLServer表达式. AS:用于分隔两个参 ...
- Ajax与Xml
Ajax就是用javascript来实现的 主要是用来实现页面的局部刷新,比如当你在百度上回答别人的问题时候,没有登录,页面会弹出一个窗口,让你输入账号和密码,这就是利用ajax来做的,如果不是aja ...