【题目链接】

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. ASP.NET并发处理

    http://blog.csdn.net/hliq5399/article/details/6280288

  2. Windows基于Apache的svn服务器配置

    参照 http://bbs.iusesvn.com/thread-158-1-1.html文章,经过svn的洗刷,终于把它配置成功,现在把我所配置的方法,记录下来,以供其他有需要的朋友参考,需要改进的 ...

  3. 创业草堂之六:CEO的财务自修课

    创业团队中一个最普遍的缺陷,是团队--尤其是团队的核心人物CEO,缺乏基本的财务知识和技能.一个不懂财务知识的CEO,即使业务能力再强,在投资人的眼里,他/她依然是一个笨拙的CEO.粗糙的CEO.鲁莽 ...

  4. 应用程序加载外部字体文件(使用AddFontResource API函数指定字体)

    /* MSDN: Any application that adds or removes fonts from the system font table should notify other w ...

  5. REACTOS(193)与汇编编译器(69)的高人

    REACTOS(193)与汇编编译器(69)的高人http://blog.csdn.net/caimouse ReactOS编译成VS工程1: 首先从https://www.reactos.org/w ...

  6. Android:数据存储之SQLite

    Android在运行时集成了SQLite , 所以每个Android应用程序都可以使用SQLite数据库. 我们通过SQLiteDatabase这个类的对象操作SQLite数据库,而且不需要身份验证. ...

  7. Spring与Struts2整合VS Spring与Spring MVC整合

    Spring与Struts2整合,struts.xml在src目录下 1.在web.xml配置监听器 web.xml <!-- 配置Spring的用于初始化ApplicationContext的 ...

  8. 88. Merge Sorted Array

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...

  9. Filter设计实现IP地址限制

    示例:创建一个IP过滤Filter,当一个用户发出访问请求的时候,首先通过过滤器进行判断, 如果用户的IP地址被限制,就禁止访问,只有合法的IP才可以继续访问.IP过滤Filter代码如下: IPFi ...

  10. Python第一天——初识Python

    python是由荷兰人Guido van Rossum 于1989年发明的一种面向对象的的解释型计算机程序设语言,也可以称之为编程语言.例如java.php.c语言等都是编程语言. 那么为什么会有编程 ...