题目


分析

如果对于每一个频道单独跑斯坦纳树可能会存在两种频道共用一条道路而重复统计的情况,

考虑状压dp,设\(f[s]\)表示选择频道二进制状态为\(s\)的最小贡献,那么对于每个状态跑斯坦纳树然后状压求最小值即可


代码

#include <cstdio>
#include <cctype>
#include <queue>
#include <vector>
#include <cstring>
#define rr register
using namespace std;
const int N=1101; vector<int>K[11];
struct node{int y,w,next;}e[N*6]; queue<int>q;
int dp[N][N],f[N],as[N],two[11],n,m,kk,k,v[N],et=1,a[11],b[11];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void Spfa(int z){
while (!q.empty()){
rr int x=q.front(); q.pop();
for (rr int i=as[x];i;i=e[i].next)
if (dp[z][e[i].y]>dp[z][x]+e[i].w){
dp[z][e[i].y]=dp[z][x]+e[i].w;
if (!v[e[i].y]) v[e[i].y]=1,q.push(e[i].y);
}
v[x]=0;
}
}
inline void Steiner(int o){
for (rr int S=1;S<two[o];++S){
for (rr int i=1;i<=n;++i){
for (rr int j=S&(S-1);j;j=(j-1)&S)
if (dp[S][i]>dp[j][i]+dp[S^j][i])
dp[S][i]=dp[j][i]+dp[S^j][i];
if (dp[S][i]<0x3f3f3f3f) q.push(i),v[i]=1;
}
Spfa(S);
}
}
signed main(){
n=iut(),m=iut(),kk=iut(),two[0]=1;
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut(),w=iut();
e[++et]=(node){y,w,as[x]},as[x]=et;
e[++et]=(node){x,w,as[y]},as[y]=et;
}
memset(v,-1,sizeof(v));
for (rr int i=1;i<=kk;++i){
a[i]=iut(),b[i]=iut();
if (v[a[i]]==-1) v[a[i]]=k++;
K[v[a[i]]].push_back(b[i]);
}
for (rr int i=1;i<=kk;++i) two[i]=two[i-1]<<1;
f[0]=0,memset(v,0,sizeof(v));
for (rr int S=1;S<two[k];++S){
memset(dp,0x3f,sizeof(dp));
rr int now,len,o=0;
for (rr int j=0;j<k;++j)
if ((S>>j)&1){
len=K[j].size(),now=K[j][0];
for (rr int i=0;i<len;++i)
dp[two[o++]][K[j][i]]=0;
}
Steiner(o);
f[S]=dp[two[o]-1][now];
}
for (rr int S=1;S<two[k];++S)
for (rr int j=S&(S-1);j;j=(j-1)&S)
if (f[S]>f[j]+f[S^j]) f[S]=f[j]+f[S^j];
return !printf("%d",f[two[k]-1]);
}

#斯坦纳树,状压dp#洛谷 3264 [JLOI2015]管道连接的更多相关文章

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

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

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

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

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

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

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

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

  5. 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)

    传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ...

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

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

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

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

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

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

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

    传送门 感觉对斯坦纳树还是有很多疑惑啊…… 等到时候noip没有爆零的话再回来填坑好了 //minamoto #include<iostream> #include<cstdio&g ...

  10. hdu4085 Peach Blossom Spring 斯坦纳树,状态dp

    (1)集合中元素表示(1<<i), i从0开始 (2)注意dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s ...

随机推荐

  1. 泛型类Generic注解

    在 Python 的 typing 模块中,Generic 是一个泛型类,用于创建参数化的类和函数,以便支持不同类型的参数.它允许你定义具有类型参数的类,这些类型参数在实例化时才确定.这样,你可以在不 ...

  2. day02---虚拟机上网模式

    修改虚拟网络编辑器 虚拟软件网络模式介绍 NAT网络模式 特点:虚拟主机和宿主机网络信息 可以不一致 优点:不容易出现局域网中IP地址冲突 缺点:其它宿主机不能直接访问虚拟机 桥接网络模式 特点:虚拟 ...

  3. 【LeetCode链表#8】翻转链表(双指针+递归)/K个一组翻转

    翻转链表 力扣题目链接(opens new window) 题意:反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4-> ...

  4. 关于“非法的前向引用(illegal forward reference)”的探究

    1.问题: 有如下代码: public class Test { static { i = 0;// 给变量赋值可以正常编译通过 System.out.print(i);// 编译器会提示" ...

  5. github.com/json-iterator/go 详细教程

    最近接触到了 github.com/json-iterator/go , 是由滴滴开源的第三方json编码库,它同时提供Go和Java两个版本. 文中大量内容来自 github 上的 wiki 文档, ...

  6. 我的第一个项目(十三) :组件间传值的一些方案(vuex,eventbus,localStorage)

    好家伙,   先说一下我的需求,我要组件间传值 1.eventBus 前端兄弟组件传值eventbus无法使用 不报错也不触发,就很奇怪 //eventBus.js import Vue from & ...

  7. 【Azure Entra ID】如何在中国区获取用户 StrongAuthenticationUserDetails 和 StrongAuthenticationMethods 信息

    问题描述 如何在中国区获取用户 StrongAuthenticationUserDetails 和 StrongAuthenticationMethods 信息 ? StrongAuthenticat ...

  8. PlatformIO+esp32+添加自己的库(.c.h文件)

        什么都放main.c的话,很有可能堆积成屎山,所以我想给分开写,每个功能有自己的.c..h文件. 在lib下新建文件夹,例如led,再在里面分别建led.c.led.h; 写好内容后再main ...

  9. Excel去除表格密码保护

    表格受密码保护时,我们修改数据Excel弹出"您试图更改的单元格或图表受保护,因而是只读的.若要修改受保护单元格或图表,请先使用'撤消工作表保护'命令(在'审阅'选项卡的'更改'组中)来取消 ...

  10. 探索Git内部原理

    Git是一个开源的分布式版本控制系统,是目前主流的版本控制系统,很多软件项目都会用它做源代码管理.Git的常用操作想必很多人都会,但是可能了解Git内部原理的人并不多.了解一些底层的东西,可以更好的帮 ...