裸的状压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]管道连接的更多相关文章

  1. BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)

    4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...

  2. [BZOJ4006][JLOI2015]管道连接 状压dp+斯坦纳树

    4006: [JLOI2015]管道连接 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1020  Solved: 552[Submit][Statu ...

  3. [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp

    管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...

  4. BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1171  Solved: 639[Submit][Status][Discuss] Descripti ...

  5. BZOJ_4006_[JLOI2015]管道连接_斯坦纳树

    BZOJ_4006_[JLOI2015]管道连接_斯坦纳树 题意: 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m ...

  6. luogu P3264 [JLOI2015]管道连接

    LINK:管道连接 一张无向图 有P个关键点 其中有K个集合 各个集合要在图中形成联通块 边有边权 求最小代价. 其实还是生成树问题 某个点要和某个点要在生成树中 类似这个意思. 可以发现 是斯坦纳树 ...

  7. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  8. 【bzoj4006】[JLOI2015]管道连接(斯坦纳树+dp)

    题目链接 题意: 给出\(n\)个点,\(m\)条边,同时给出\(p\)个重要的点以及对应特征. 现在要选出一些边,问使得这\(p\)个所有特征相同的点相连,问最小代价. 思路: 斯坦纳树的应用场景一 ...

  9. [JLOI2015]管道连接

    题目描述 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰.该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m 对情报站 ui;vi 和费用 wi,表示情报站 ui 和 v ...

随机推荐

  1. HTTP协议(转自:小坦克博客)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

  2. iOS 框架收集

    检测硬件设备信息 https://github.com/Shmoopi/iOS-System-Services

  3. 不要温柔地走入AMD

    1.无依赖情况 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. 基于Spark ALS构建商品推荐引擎

    基于Spark ALS构建商品推荐引擎   一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速.更准确的获得所需 ...

  5. STRUTS2 标签 循环次数

    *<s:property value="menus.size()"/> * <s:if test='menus.size()>8'>    sssss ...

  6. 三种实例化bean的方式

    在spring中有三中实例化bean的方式: 一.使用构造器实例化:(90%通常使用的一个方法) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化. 每种实例化所采用的配置是不一样的: 一. ...

  7. SQL SERVER 2008函数大全(含例子)

    --SQL SERVER 2008 函数大全 /* author:TracyLee csdncount:Travylee */ /* 一.字符串函数: 1.ascii(字符串表达式)    返回字符串 ...

  8. linux内核的熵池

    也可以看百度科 Linux内核采用熵来描述数据的随机性.熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大.在信息学中,熵被用来表征一个符号或 ...

  9. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  10. struts2 详解

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.struts使 ...