【题目链接】

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)的更多相关文章

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

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

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

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

  3. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

  4. bzoj 4006 [JLOI2015]管道连接——斯坦纳树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 除了模板,就是记录 ans[ s ] 表示 s 合法的最小代价.合法即保证 s 里同一 ...

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

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

  6. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

  7. 【BZOJ4774/4006】修路/[JLOI2015]管道连接 斯坦纳树

    [BZOJ4774]修路 Description 村子间的小路年久失修,为了保障村子之间的往来,法珞决定带领大家修路.对于边带权的无向图 G = (V, E),请选择一些边,使得1 <= i & ...

  8. 洛谷P3264 [JLOI2015]管道连接 (斯坦纳树)

    题目链接 题目大意:有一张无向图,每条边有一定的花费,给出一些点集,让你从中选出一些边,用最小的花费将每个点集内的点相互连通,可以使用点集之外的点(如果需要的话). 算是斯坦纳树的入门题吧. 什么是斯 ...

  9. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][ ...

随机推荐

  1. 手动安装UniDAC的过程

    每次安装都不一样,而且有时候挺麻烦的,所以记下来.我这次安装过程是这样的: 0. 修改Source\Delphi7\Make.bat,填入正确的IdeDir 1.找到source\delphi7目录, ...

  2. 修改Eclipse字体

    选择菜单:Windows->Preferences->Genneral->Appearance->Colors and Font

  3. OpenVAS漏洞扫描基础教程之OpenVAS概述及安装及配置OpenVAS服务

    OpenVAS漏洞扫描基础教程之OpenVAS概述及安装及配置OpenVAS服务   1.  OpenVAS基础知识 OpenVAS(Open Vulnerability Assessment Sys ...

  4. Apache编译与安装 RedHat enterprises 6.2

    引自:http://blog.chinaunix.net/uid-26881541-id-3336614.html http://apr.apache.org/download.cgi 命令: yum ...

  5. 修改linux命令行提示符路径显示

    命令显示行太长,影响观感,这样需要修改,具体方法: 1. 修改 ~/.bashrc,在最后一行添加: export PS1='[\u@\h\W]$' 其中\u是当前用户名,\h是当前主机名,\w显示当 ...

  6. [Quick-x]cocos2dx下的彩色文本显示--RichLabel

    部分关键代码与思路参考 http://www.cocoachina.com/bbs/read.php?tid=218977&page=1 感谢原作者 i7909 代码下载地址:https:// ...

  7. epoll和poll效率差异

    http://blog.163.com/sky20081816@126/blog/static/164761023201073033517435/ 百度“epoll和poll”

  8. hadoop拾遗(二)---- 文件模式

    在单个操作中处理一批文件,这是一个常见的要求.举例来说,处理日志的MapReduce作业可能需要分析一个月内包含在大量目录中的日志文件.在一个表达式中使用通配符来匹配多个文件是比较方便的,无需列举第个 ...

  9. POJ 水题若干

    POJ 3176 Cow Bowling 链接: http://poj.org/problem?id=3176 这道题可以算是dp入门吧.可以用一个二维数组从下向上来搜索从而得到最大值. 优化之后可以 ...

  10. LTDFZ

    开关稳压器