【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个点. 可以发现我们利用克鲁斯 ...
随机推荐
- Functional Reactive Programming
Functional Reactive Programming (FRP) integrates time flow and compositional events into functional ...
- java @XmlTransient与@Transient区别
1.@XmlTransient a.@XmlTransient 注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射 b.阻止将 JavaBean 属性映射到 X ...
- 2、Android-UI(RecyclerView)
2.6.滚动控件-RecylerView ListView虽然使用的效果很好但是也是有缺点的 不使用一些技巧来提升它的运行效率,性能就非常差 扩展性也不是很好 只能实现数据的纵向滚动效果 实现横向滚动 ...
- Tomcat中日志组件
Tomcat日志组件 AccessLog接口 public interface AccessLog { public void log(Request request, Response respon ...
- PAT——1037. 在霍格沃茨找零钱
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...
- UVA - 1160(简单建模+并查集)
A secret service developed a new kind of explosive that attain its volatile property only when a spe ...
- 生产者-消费者模型-线程安全队列Queue
#python3 #product new data into the queue #comsume data from the queue from queue import Queue impor ...
- String系列01 - String 60%
1.String简介 String类实现CharSequence接口.(同时,实现Serializable, Comparable 接口). String类使用final修饰符,为final类,不可被 ...
- html标签种类
标签 描述 <!--...--> 定义注释. <!DOCTYPE> 定义文档类型. <a> 定义锚. <abbr> 定义缩写. <acronym& ...
- 【Javascript-基础-Date】本地时间与UTC(GMT)时间转换
UTC(GMT) 整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinat ...