题目描述

给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色。要求选出若干条边,使得颜色相同的特殊点在同一个连通块内。输出最小边权和。

输入

第一行包含三个整数 n;m;p,表示情报站的数量,可以建立的通道数量和重要情报站的数

量。接下来 m 行,每行包含三个整数 ui;vi;wi,表示可以建立的通道。最后有 p 行,每行包含
两个整数 ci;di,表示重要情报站的频道和情报站的编号。

输出

输出一行一个整数,表示任意相同频道的情报站之间都建立通道连接所花费的最少资源总量。

样例输入

5 8 4
1 2 3
1 3 2
1 5 1
2 4 2
2 5 1
3 4 3
3 5 1
4 5 1
1 1
1 2
2 3
2 4

样例输出

4


题解

斯坦纳树+状压dp

由于点数很小,因此求出斯坦纳树,求法可以参考 【bzoj2595】[Wc2008]游览计划 。

那么对于本题,由于不要求选出的只有一个连通块,因此不能直接拿到答案。

考虑状压dp,设 $g[i]$ 表示状态为 $i$ 的所有颜色满足同颜色连通的最小代价。那么如果只有一个连通块则答案就是斯坦纳树的 $f[v][i]$ ,其中 $v$ 是所有颜色状态为 $i$ 的点对应的状态。不只有一个连通块的话则枚举子集转移。

时间复杂度 $O(3^p·n+2^p·m\log n)=O(能过)$

#include <queue>
#include <cstdio>
#include <cstring>
#include <utility>
using namespace std;
typedef pair<int , int> pr;
priority_queue<pr> q;
int head[1010] , to[6010] , len[6010] , next[6010] , cnt , c[15] , d[15] , f[1030][1010] , vis[1030][1010] , g[1030];
inline void add(int x , int y , int z)
{
to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
int main()
{
int n , m , p , i , j , k , x , y , z;
scanf("%d%d%d" , &n , &m , &p);
memset(f , 0x3f , sizeof(f));
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%d" , &x , &y , &z) , add(x , y , z) , add(y , x , z);
for(i = 1 ; i <= p ; i ++ ) scanf("%d%d" , &c[i] , &d[i]) , f[1 << (i - 1)][d[i]] = 0;
for(i = 1 ; i <= n ; i ++ ) f[0][i] = 0;
for(i = 1 ; i < 1 << p ; i ++ )
{
for(j = i ; j ; j = i & (j - 1))
for(k = 1 ; k <= n ; k ++ )
f[i][k] = min(f[i][k] , f[j][k] + f[i ^ j][k]);
for(j = 1 ; j <= n ; j ++ ) q.push(pr(-f[i][j] , j));
while(!q.empty())
{
x = q.top().second , q.pop();
if(vis[i][x]) continue;
vis[i][x] = 1;
for(j = head[x] ; j ; j = next[j])
if(f[i][to[j]] > f[i][x] + len[j])
f[i][to[j]] = f[i][x] + len[j] , q.push(pr(-f[i][to[j]] , to[j]));
}
}
memset(g , 0x3f , sizeof(g));
for(i = 1 ; i < 1 << p ; i ++ )
{
k = 0;
for(j = 1 ; j <= p ; j ++ )
if(i & (1 << (c[j] - 1)))
k |= (1 << (j - 1));
for(j = 1 ; j <= n ; j ++ ) g[i] = min(g[i] , f[k][j]);
for(j = i ; j ; j = i & (j - 1)) g[i] = min(g[i] , g[j] + g[i ^ j]);
}
printf("%d\n" , g[(1 << p) - 1]);
return 0;
}

【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp的更多相关文章

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

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

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

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

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

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

  4. bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...

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

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

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

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

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

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

  8. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

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

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

随机推荐

  1. 20155339 2016-2017-2 《Java程序设计》第4周学习总结

    20155339 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承.多态与is-a 继承就是避免多个类间重复定义共同行为. 可以把相同的成粗代码提升为父类 ...

  2. 20145226夏艺华 EXP5 MSF基础应用

    实践目标 · 掌握metasploit的基本应用方式. · 具体需要完成 (1)ms08_067; (2)ms11_050: (3)Adobe (4)成功应用任何一个辅助模块. 报告 本次实验一共用到 ...

  3. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  4. win2012r2 关闭中英文悬浮小方框显示

    因为那是微软输入法自带的   2012下关不掉  所以切换成美式键盘就没有了

  5. 创建Springmvc项目时,特殊拦截器失效情况的原因及解决办法

    最近开发一个新项目时,搭建springmvc框架时,遇到一个拦截器失效的情况困扰了两天.现在解决,特此记录一下. 拦截器不生效的情况描述: 设置登录拦截的时候,首先登录接口肯定是不用拦截的.所以需要在 ...

  6. RDS for MySQL有哪些限制

    原文来自:https://help.aliyun.com/knowledge_detail/41834.html 1.不支持在命令行创建数据库和数据库账号.只支持在RDS管理控制台操作. 2.不支持M ...

  7. Maven学习(八)-----Maven依赖机制

    Maven依赖机制 在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级. 案例分析 让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要 ...

  8. selenium 列表循环定位方法。

    话不多说,直接上代码. 就是循环第一层,然后拼接,然后继续循环,继续屏接,任你多少层都不是问题. def c_select(self, values, text): """ ...

  9. 兰亭集势股价疯涨背后:物流成外贸B2C发展掣肘

    21世纪经济报道 汤浔芳 北京报道 核心提示:“兰亭集势涨势喜人,这样的增长是这两三年中概股没有出现过的.”一位负责美股投资的基金合伙人告诉记者,此前,中概股比较低迷,持续大幅度上涨,难得一见. 在唯 ...

  10. Java访问控制

    转自:菜鸟教程