【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. Functional Reactive Programming

    Functional Reactive Programming (FRP) integrates time flow and compositional events into functional ...

  2. java @XmlTransient与@Transient区别

    1.@XmlTransient a.@XmlTransient 注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射 b.阻止将 JavaBean 属性映射到 X ...

  3. 2、Android-UI(RecyclerView)

    2.6.滚动控件-RecylerView ListView虽然使用的效果很好但是也是有缺点的 不使用一些技巧来提升它的运行效率,性能就非常差 扩展性也不是很好 只能实现数据的纵向滚动效果 实现横向滚动 ...

  4. Tomcat中日志组件

    Tomcat日志组件 AccessLog接口 public interface AccessLog { public void log(Request request, Response respon ...

  5. PAT——1037. 在霍格沃茨找零钱

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  6. UVA - 1160(简单建模+并查集)

    A secret service developed a new kind of explosive that attain its volatile property only when a spe ...

  7. 生产者-消费者模型-线程安全队列Queue

    #python3 #product new data into the queue #comsume data from the queue from queue import Queue impor ...

  8. String系列01 - String 60%

    1.String简介 String类实现CharSequence接口.(同时,实现Serializable, Comparable 接口). String类使用final修饰符,为final类,不可被 ...

  9. html标签种类

    标签 描述 <!--...--> 定义注释. <!DOCTYPE> 定义文档类型. <a> 定义锚. <abbr> 定义缩写. <acronym& ...

  10. 【Javascript-基础-Date】本地时间与UTC(GMT)时间转换

    UTC(GMT) 整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinat ...