#斯坦纳树,状压dp#洛谷 3264 [JLOI2015]管道连接
分析
如果对于每一个频道单独跑斯坦纳树可能会存在两种频道共用一条道路而重复统计的情况,
考虑状压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]管道连接的更多相关文章
- 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
- bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
- 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)
传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ...
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2030 Solved: 986[Submit][Status][ ...
- 洛谷P3264 [JLOI2015]管道连接 (斯坦纳树)
题目链接 题目大意:有一张无向图,每条边有一定的花费,给出一些点集,让你从中选出一些边,用最小的花费将每个点集内的点相互连通,可以使用点集之外的点(如果需要的话). 算是斯坦纳树的入门题吧. 什么是斯 ...
- 洛谷P3264 [JLOI2015]管道连接(斯坦纳树)
传送门 感觉对斯坦纳树还是有很多疑惑啊…… 等到时候noip没有爆零的话再回来填坑好了 //minamoto #include<iostream> #include<cstdio&g ...
- 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 ...
随机推荐
- 以解析csv数据为例,讨论string、char[]、stream 不同类型来源是否能进行高性能读取解析封装可能性
篇幅较长,所以首先列举结果,也就是我们的目的 核心目的为探索特定场景对不同类型数据进行统一抽象,并达到足够高性能,也就是一份代码实现,对不同类型数据依然高性能 以下为结果,也就是我们的目的: 对1w行 ...
- 云原生:使用HPA和VPA实现集群扩缩容
1 背景 我们之前介绍过,随着业务流量上涨之后,我们的系统需要适时的进行扩容. 数据存储层我们也介绍过MySQL的扩容 Scale UP(纵向扩展) 和 Scale Out(横向扩展) 垂直拆分(Sc ...
- 【Azure 存储服务】多设备并发往 Azure Storage Blob 的 Container 存数据是否可以
问题描述 多设备并发往 Azure Storage Blob 的 Container 存数据是否可以? 问题解答 可以! Azure Storage 是支持的并发存储数据的,Blob 可以使用乐观并发 ...
- 浅析图数据库 Nebula Graph 数据导入工具——Spark Writer
从 Hadoop 说起 近年来随着大数据的兴起,分布式计算引擎层出不穷.Hadoop 是 Apache 开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用.Hadoop 的设计核心思想 ...
- flutter3-winchat桌面端聊天实例|Flutter3+Dart3+Getx仿微信Exe程序
首发原创flutter3+bitsdojo_window+getx客户端仿微信exe聊天Flutter-WinChat. flutter3-dart3-winchat 基于flutter3+dart3 ...
- 【专业技能】程序员的软件工程素养之画好 UML 时序图
目录 前言 一.认识时序图 1.1时序图元素 1.2怎么使用 二.画好时序图 2.1一般步骤 2.2举个例子 2.3推荐工具 三.其它作用 四.文章小结 前言 笔者在本科的时候上过软件工程的专业课,也 ...
- Java 包装类的使用(自动装箱+自动拆箱)+Vector
1 package com.bytezreo.ut; 2 3 import java.util.Scanner; 4 import java.util.Vector; 5 6 /** 7 * 8 * ...
- Codeforces Round 787 (Div. 3)D. Vertical Paths
题目链接 题意:给定一棵树,将这棵树划分成几天互不相交的链,要求最小化链的数量 思路:每个叶子节点一定在一条链中,所以链的数量就是叶子节点的数量,从叶子节点往上跳直到根节点,边跳边标记,路径上所有点都 ...
- Spring事务(六)-只读事务
@Transactional(readOnly=true)就可以把事务方法设置成只读事务.设置了只读事务,事务从开始到结束,将看不见其他事务所提交的数据.这在某种程度上解决了事务并发的问题.一个方法内 ...
- Zabbix“专家坐诊”第192期问答汇总
问题一 Q:请问下,客户机snmptrap发告警为啥server web收不到,关键是snmptrap日志已经收到,zabbix server配置以及开启snmptrap=1 snmptrap=var ...