BZOJ4006 [JLOI2015]管道连接
裸的状压DP
令$f_S$表示包含颜色集合S的最小斯坦纳生成森林的值,于是有:
$$f_S=\min\{f_S,f_s+f_{S-s}|s\subset S\}$$
然后嘛。。。还是裸的斯坦纳树搞搞。。。又是个状压【摔!
貌似会TLE的说【额。。。
然后PoPoQQQ大爷分析了一番,说,大概1E的复杂度,不会T!
好,那就不会好了!(也太不求上进了吧)
/**************************************************************
Problem: 4006
User: rausen
Language: C++
Result: Accepted
Time:7272 ms
Memory:5160 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int M = 3e3 + ;
const int N = 1e3 + ;
const int K = ;
const int Sz_q = N * ;
const int inf = 0x3f3f3f3f; inline int read(); struct edge {
int next, to, v;
edge(int _n = , int _t = , int _v = ) : next(_n), to(_t), v(_v) {}
} e[M << ]; struct point {
int c, w; inline void get() {
c = read(), w = read();
} inline bool operator < (const point &p) const {
return c < p.c;
}
} p[K]; int n, m, k, c, cnt;
int first[N], tot;
int f[][N], g[];
int l, r, q[Sz_q], v[N]; inline void Add_Edges(int x, int y, int z) {
e[++tot] = edge(first[x], y, z), first[x] = tot;
e[++tot] = edge(first[y], x, z), first[y] = tot;
} #define y e[x].to
void spfa(int *dis) {
static int x, p;
while (l != (r + ) % Sz_q) {
p = q[l], v[p] = , ++l %= Sz_q;
for (x = first[p]; x; x = e[x].next)
if (dis[p] + e[x].v < dis[y]) {
dis[y] = dis[p] + e[x].v;
if (!v[y]) {
v[y] = ;
if (dis[y] < dis[q[l]]) q[(l += Sz_q - ) %= Sz_q] = y;
else q[++r %= Sz_q] = y;
}
}
}
}
#undef y int work() {
static int S, s, i, res;
for (S = ; S < << cnt; ++S) {
for (i = ; i <= n; ++i) {
for (s = S & (S - ); s; (--s) &= S)
f[S][i] = min(f[S][i], f[s][i] + f[S ^ s][i]);
if (f[S][i] != inf) q[++r %= Sz_q] = i;
}
spfa(f[S]);
}
for (res = inf, i = ; i <= n; ++i)
res = min(res, f[( << cnt) - ][i]);
return res;
} int main() {
int i, x, y, z, S, s, nowc;
n = read(), m = read(), k = read();
for (i = ; i <= m; ++i) {
x = read(), y = read(), z = read();
Add_Edges(x, y, z);
}
for (i = ; i <= k; ++i) p[i].get();
sort(p + , p + k + );
for (nowc = -, c = , i = ; i <= k; ++i) {
if (p[i].c != nowc) nowc = p[i].c, ++c;
p[i].c = c;
} memset(g, 0x3f, sizeof(g));
for (S = ; S < << c; ++S) {
for (cnt = , i = ; i <= k; ++i)
if (S & ( << p[i].c - )) ++cnt;
memset(f, 0x3f, sizeof(f[][]) * N * ( << cnt));
for (cnt = , i = ; i <= k; ++i)
if (S & ( << p[i].c - )) f[ << cnt++][p[i].w] = ;
g[S] = work();
}
for (S = ; S < << c; ++S)
for (s = S & (S - ); s; (--s) &= S)
g[S] = min(g[S], g[s] + g[S ^ s]);
printf("%d\n", g[( << c) - ]);
return ;
} inline int read() {
static int x;
static char ch;
x = , ch = getchar();
while (ch < '' || '' < ch)
ch = getchar();
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return x;
}
BZOJ4006 [JLOI2015]管道连接的更多相关文章
- BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...
- [BZOJ4006][JLOI2015]管道连接 状压dp+斯坦纳树
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1020 Solved: 552[Submit][Statu ...
- [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
- BZOJ_4006_[JLOI2015]管道连接_斯坦纳树
BZOJ_4006_[JLOI2015]管道连接_斯坦纳树 题意: 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m ...
- luogu P3264 [JLOI2015]管道连接
LINK:管道连接 一张无向图 有P个关键点 其中有K个集合 各个集合要在图中形成联通块 边有边权 求最小代价. 其实还是生成树问题 某个点要和某个点要在生成树中 类似这个意思. 可以发现 是斯坦纳树 ...
- 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
- 【bzoj4006】[JLOI2015]管道连接(斯坦纳树+dp)
题目链接 题意: 给出\(n\)个点,\(m\)条边,同时给出\(p\)个重要的点以及对应特征. 现在要选出一些边,问使得这\(p\)个所有特征相同的点相连,问最小代价. 思路: 斯坦纳树的应用场景一 ...
- [JLOI2015]管道连接
题目描述 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰.该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m 对情报站 ui;vi 和费用 wi,表示情报站 ui 和 v ...
随机推荐
- kakfa源代码开发环境搭建过程中的错误处理
在window上搭建kafka的源代码开发环境,主要参考如下的blog: http://www.bubuko.com/infodetail-695974.html << Window ...
- iOS - OC 基本语法
1.常见文件扩展名 .c C 语言源文件 .cc..cpp C++ 语言源文件 .m Objective-C 源文件 .mm Objective-C++ 源文件 .h 头文件 .pl Perl 源文件 ...
- iOS - MVC 架构模式
1.MVC 从字面意思来理解,MVC 即 Modal View Controller(模型 视图 控制器),是 Xerox PARC 在 20 世纪 80 年代为编程语言 Smalltalk-80 发 ...
- win10系统更新补丁时进度条一直卡在0%不动的解决方案
为了能够让win10系统更加安全稳定,很多用户都会时不时为自己的电脑安装补丁.不过,部分用户在为win10系统更新补丁时,却会遇到进度条一直卡在0%不动的问题.这该怎么办呢?下面,小编就告诉大家解决该 ...
- new road
9月底进入到了新的公司,有些类似实习的时候的路程. 新公司的数据业务基本是一种幻想状态,完全没有什么数据方面的积淀.
- Java中List的使用
package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class ListTest { p ...
- 关于jQuery的小知识点
jQuery 简介 jQuery 库可以通过一行简单的标记被添加到网页中. jQuery 库 - 特性 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- hdu4418(概率dp + 高斯消元)
应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...
- Java Garbage Collection/垃圾收集 策略查看
Java 的垃圾收集有各种各样的策略,默认的策略也会经常的改变. --比如到底是 serial , parallel, CMS; 具体到 Minor 怎么样,Old 又怎么样? 命令 java -XX ...