裸的状压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. Java——Image 图片合并

    1.合并图片 package com.tb.image; import java.awt.Image; import java.awt.image.BufferedImage; import java ...

  2. 3.29考试(HNOI难度)

    一. 城镇 [ town ]   Memory Limit: 128 MB    Time Limit : 1s Description 在 farmer land 上,有 N 个 farmer to ...

  3. python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法

    python_way day18 html-day4 1.Django-路由系统   - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...

  4. javascript权威指南笔记--javascript语言核心(四)

    对象: 通过引用(而非值)来操作对象: var obj = {"x":1,"y":2}; var copyObj = obj; copyObj.x = 5; c ...

  5. iOS - Swift NSFileManage 文件管理

    前言 public class NSFileManager : NSObject public class NSFileHandle : NSObject, NSSecureCoding NSFile ...

  6. nodejs学习笔记<一>安装及环境搭建

    零零散散学了几天nodejs,进度一直停滞不前,今天沉下心来好好看了下nodejs的介绍和代码.自己也试着玩了下,算是有点入门了. 这里来做个学习笔记. ——————————————————————— ...

  7. 转:C/C++基本数据类型所占字节数

    参考:http://blog.csdn.net/vast_sea/article/details/8076934 关于这个基本的问题,很早以前就很清楚了,C标准中并没有具体给出规定那个基本类型应该是多 ...

  8. Android控件之ToggleButton(多状态按钮)

    一.概述 ToggleButton有两种状态:选中状态和没选中状态(类似一个开关),并且需要为不同的状态设置不同的显示文本 二.ToggleButton属性 android:checked = &qu ...

  9. 搭建一个简单的Struts2框架

    1  创建一个web项目. 2 导入必要的JAR文件. 放在WEB-INF下lib包里. 3 添加web.xml配置,添加启动配置. <?xml version="1.0" ...

  10. hook_schema 小总结

    1, primary key 可以带空格 做为下表 但field就不行 2, dev_node 仅为下标 'primary key' => array('nid'),    'foreign k ...