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 ...
随机推荐
- plot bar chart using python
Example import matplotlib.pyplot as plt import plotly.plotly as py # Learn about API authentication ...
- Android获取窗体信息的Util方法
package com.wangyi.tools; import android.app.Activity; import android.util.DisplayMetrics; public cl ...
- iOS - Swift NSData 数据
前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutabl ...
- iOS - UIProgressView
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIProgressView : UIView <NSCoding> @available(iOS 2. ...
- CDN学习笔记一(CDN是什么?)
CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...
- mysql批量替换数据库某字段部分内容
update 表名 set 字段名=replace(字段名,’要替换的内容’,’替换后的内容’) eg:修改scenario表中的picture字段中的ip地址. UPDATE scenario SE ...
- 用Jquery获取select的value和text值
$("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkText=$(&q ...
- (六)ARM状态寄存器-PSR
ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...
- Android 自定义列表指示器
在联系人界面 可以看到这种界面 手指快速滑动右边滑动条时 可以显示相应的字母图标 android里提供了android.widget.SectionIndexer这个接口去实现该效果 可是只能显示字母 ...
- Objective-C与C++的区别
1.两者的最大相同:都是从C演化而来的面相对象语言,两者都兼容标准C语言 2.两者的最大不同:Objective-C提供了运行期动态绑定机制,而C++是编译静态绑定,并且通过嵌入类(多重继承)和虚函数 ...