题目描述

给出一张 $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. 20155336 2016-2017-2 《Java程序设计》第三周学习总结

    20155336 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类与对象 定义: 对象(Object):存在的具体实体,具有明确的状态和行为. 类( ...

  2. QT-2D编程

    QT-[转]2D编程 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕上和绘图·设备上进行绘制,主要基于QPainter.QPainterDevice和QPainterEngine这3个类. ...

  3. SaltStack入门篇(六)之部署Redis主从实现和Job管理

    一.部署Redis主从 需求: 192.168.56.11是主,192.168.56.12是从 redis监听自己的ip地址,而不是0.0.0.0 分析: linux-node1 安装 配置 启动 l ...

  4. weka使用笔记3---classfily API调用

    分类器在数据挖掘中的作用不言而喻,weka中的分类器有很多种类型,但是weka在输出结果中,只输出了一个分类的预测的类型,没有输出分类的得分,有一些不给力.如果想知道得分和其预测的类的话,就得调用we ...

  5. 创龙OMAPL138开发板测试(1)

    1. 里面的DSP内核是否能单独使用?先测试一个LED灯的例程先,仿真器连接上开发板,显示有C6748和PRU还有ARM9.对了,板子的拨码开关要01111,是DEBUG模式才可以. 2. 下载一下. ...

  6. 通过dotnet命令行设置asp.net core服务的启动地址

    需求: 通过dotnet命令行启动asp.net core 服务时,自定义监听端口. 方法: 在program.cs中增加命令行参数配置: WebHost.CreateDefaultBuilder(a ...

  7. Charles连接苹果及JSON乱码情况解决

    1.  Charles的JSON乱码情况解决: 点击Charles界面上的help—SSL proxying—install Charles Root Certificate,将证书安装到[受信任的根 ...

  8. 自动化之UI(autoit)

    自动化 说到自动化,我真的很不喜欢UI这层去做实践.前置条件要求比较严谨,如果不满足特定的前置条件,那么成本实在太大了. 投入与产出差过大,效果打折扣.从互联网来说,UI自动化是入门门槛很低的一种实践 ...

  9. [转]如何设计自适应屏幕大小的网页 Responsive Web Design

    随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...

  10. JS中自定义事件的使用与触发

    1. 事件的创建 JS中,最简单的创建事件方法,是使用Event构造器: var myEvent = new Event('event_name'); 但是为了能够传递数据,就需要使用 CustomE ...