bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=4006
【题意】
给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的点都连通的最小费用。
【思路】
题目所求斯坦纳森林。
如果我们知道满足颜色集合S连通的最小值g[S],则有转移式:
G[S]=min{ g[s] , G[S’]+G[S-S’] }
则G[(1<<C)-1]即答案,G[S]定义为使得颜色集合S中所有相同颜色的点都连通的最小值。
这里的g[S],其实就是一棵包含S中所有颜色的斯坦纳树,即求一棵包含所有颜色在S中的点的斯坦纳树,我们设f[i][st]为在i点且包含点集为st的最小花费则有转移式:
f[i][st]=min{ f[i][st’]+f[i][st-st’] }
f[i][st]=min{ f[i’][st]+weight(i,i’) }
两次状压DP bingo。memset那里可以优化一下,懒得改了 =_=
【代码】
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 1e3+;
const int M = 4e3+;
const int P = ;
const int inf = 0xf0f0f0f; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
}
struct Edge { int v,w,nxt;
}e[M<<];
int en=,front[N];
void adde(int u,int v,int w)
{
e[++en]=(Edge){v,w,front[u]}; front[u]=en;
}
struct Node {
int c,w;
bool operator < (const Node& rhs) const {
return c<rhs.c;
}
}ns[P]; int n,m,K,cnt=;
int f[N][<<P],g[<<P]; queue<int> q; int inq[N]; void spfa(int sta)
{
while(!q.empty()) {
int u=q.front(); q.pop(); inq[u]=;
trav(u,i) {
int v=e[i].v;
if(f[v][sta]>f[u][sta]+e[i].w) {
f[v][sta]=f[u][sta]+e[i].w;
if(!inq[v])
inq[v]=,q.push(v);
}
}
}
}
int solve()
{
int all=<<cnt;
FOR(sta,,all-) {
FOR(i,,n) {
for(int s=(sta-)&sta;s;s=(s-)&sta)
f[i][sta]=min(f[i][sta],f[i][s]+f[i][sta-s]);
if(f[i][sta]!=inf) q.push(i),inq[i]=;
}
spfa(sta);
}
int ans=inf;
FOR(i,,n) ans=min(ans,f[i][all-]);
return ans;
} int main()
{
freopen("channel.in","r",stdin);
freopen("channel.out","w",stdout);
n=read(),m=read(),K=read();
FOR(i,,m) {
int u=read(),v=read(),w=read();
adde(u,v,w); adde(v,u,w);
}
FOR(i,,K) {
ns[i].c=read(),ns[i].w=read();
}
sort(ns+,ns+K+);
int C=;
FOR(i,,K) {
if(ns[i].c!=ns[i-].c) C++;
ns[i].c=C;
}
memset(g,0xf,sizeof(g));
int all=<<C;
FOR(sta,,all-) {
memset(f,0xf,sizeof(f));
cnt=; FOR(i,,K) if((<<ns[i].c-)&sta) f[ns[i].w][<<cnt++]=;
g[sta]=solve();
}
FOR(sta,,all-) {
for(int s=(sta-)&sta;s;s=(s-)&sta)
g[sta]=min(g[sta],g[s]+g[sta-s]);
}
printf("%d\n",g[all-]);
return ;
}
bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)的更多相关文章
- 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
- bzoj 4006 [JLOI2015]管道连接——斯坦纳树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 除了模板,就是记录 ans[ s ] 表示 s 合法的最小代价.合法即保证 s 里同一 ...
- BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- 【BZOJ4774/4006】修路/[JLOI2015]管道连接 斯坦纳树
[BZOJ4774]修路 Description 村子间的小路年久失修,为了保障村子之间的往来,法珞决定带领大家修路.对于边带权的无向图 G = (V, E),请选择一些边,使得1 <= i & ...
- 洛谷P3264 [JLOI2015]管道连接 (斯坦纳树)
题目链接 题目大意:有一张无向图,每条边有一定的花费,给出一些点集,让你从中选出一些边,用最小的花费将每个点集内的点相互连通,可以使用点集之外的点(如果需要的话). 算是斯坦纳树的入门题吧. 什么是斯 ...
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2030 Solved: 986[Submit][Status][ ...
随机推荐
- 自己常用的wireshark过滤条件
抓发给NVR的StrartRealPlay命令包: ip.src eq 118.123.114.8 and tcp contains 02:63:64:61 抓发给NVR的心跳包: ip.src e ...
- iOS开发--网络下载
这里使用的是NSURLConnection的代理请求下载,并且是具有进度,UI能实时刷新,至于NSURLConnection如何请求.并且有几种请求方法请看NSURLConnection请求简介,在这 ...
- epoll和poll效率差异
http://blog.163.com/sky20081816@126/blog/static/164761023201073033517435/ 百度“epoll和poll”
- WC约束示使用
1.接口中添加时要注意Xml序列化标签不要随意添加啊.[webInvoke].[OpertorContract]这2个约束就行了.不然,直接坑死啊.
- 在XML里的XSD和DTD以及standalone的使用3----具体使用详解
本人亲自写的一个简单的测试例子 1.xsd定义 <?xml version="1.0" encoding="utf-8"?><xs:schem ...
- 创建支持复杂脚本Complex Scripts的WINCE6.0系统
如果要创建支持复杂脚本(Complex Scripts)的系统,我们需要完成下面一系列步骤来确保系统包含所有需要支持的具体区域设置 (locale–specific). 1. 选择intern ...
- 【转载】Morris遍历二叉树 & BST(二叉搜索树) Traverse & 空间O(1) 时间O(n)
因为做一道Leetcode的题目(前面博客有:link),需要用Space O(1)空间复杂度来中序遍历树, 看了Discuss,也上网搜了一下,发现空间O(1)可以用 Morris遍历的方法.方法介 ...
- Chosen中选择项的更新
Chosen 选择项的动态修改/更新 如果你需要去动态更新select选择框里的选择项,你需要通知Chosen去响应这个变动,你需要在这个选项框是触发一个"liszt:updated&quo ...
- 函数buf_LRU_old_adjust_len
调整LUR_old位置,放到八分之五位置,是新的,后八分之三是旧的 512个页全变成新的,然后从后往前数,数到8分之3,设置为旧的 /********************************* ...
- 转:MVC2表单验证失败后,直接返回View,已填写的内容就会清空,可以这样做;MVC2输出文本;MVC2输出PDF文件
ViewData.ModelState.AddModelError("FormValidator", message); foreach (string field in Requ ...