BZOJ_4006_[JLOI2015]管道连接_斯坦纳树

题意:

小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰。

该部门有 n 个情报站,用 1 到 n 的整数编号。给出 m 对情报站 ui;vi 和费用 wi,表示情
报站 ui 和 vi 之间可以花费 wi 单位资源建立通道。
如果一个情报站经过若干个建立好的通道可以到达另外一个情报站,那么这两个情报站就
建立了通道连接。形式化地,若 ui 和 vi 建立了通道,那么它们建立了通道连接;若 ui 和 vi 均
与 ti 建立了通道连接,那么 ui 和 vi 也建立了通道连接。
现在在所有的情报站中,有 p 个重要情报站,其中每个情报站有一个特定的频道。小铭铭
面临的问题是,需要花费最少的资源,使得任意相同频道的情报站之间都建立通道连接。
 
分析:
先求一遍原图的斯坦纳树,处理出每个连通状态下的最小花费
但我们发现所求的方案并不一定是所有关键点都连通
再处理出每个频道需要情报站的状态
要进行状态之间的合并
DP g[i] = min(g[i], g[j] + g[i^j])
 
思路同BZOJ_4774
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1050
#define M 6050
int head[N],to[M],nxt[M],val[M],n,m,p,cnt,inq[N];
int dis[1025][N],Q[N],l,r,d[11],s[11];
int f[1025],g[1025],mask,tnl,is[11];
inline void add(int u,int v,int w){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w;
}
struct A{
int id,num,rnum;
}b[11];
bool cmp1(const A &x,const A &y){
return x.rnum<y.rnum;
}
bool cmp2(const A &x,const A &y){
return x.id<y.id;
}
void stan(){
int i,j,k;
memset(dis,0x3f,sizeof(dis));
for(i=1;i<=p;i++){
dis[1<<i-1][d[i]]=0;
}
for(j=1;j<=mask;j++){
for(i=1;i<=n;i++){
for(k=j&(j-1);k;k=j&(k-1)){
dis[j][i]=min(dis[j][i],dis[k][i]+dis[j-k][i]);
}
}
l=r=0;
for(i=1;i<=n;i++){
Q[r++]=i;inq[i]=1;
}
while(l^r){
int x=Q[l++];inq[x]=0;if(l==n+1)l=0;
for(k=head[x];k;k=nxt[k]){
if(dis[j][to[k]]>dis[j][x]+val[k]){
dis[j][to[k]]=dis[j][x]+val[k];
if(!inq[to[k]]){
inq[to[k]]=1;Q[r++]=to[k];if(r==n+1)r=0;
}
}
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&p);
mask=(1<<p)-1;
int i,j,x,y,z,k;
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",&b[i].rnum,&d[i]);
b[i].id=i;
}
sort(b+1,b+p+1,cmp1);
b[0].rnum=-10000;
for(i=1;i<=p;i++){
if(b[i].rnum==b[i-1].rnum){
b[i].num=b[i-1].num;
}else b[i].num= ++tnl;
}
sort(b+1,b+p+1,cmp2);
for(i=1;i<=p;i++){
s[b[i].num]|=(1<<i-1);
}
stan();
memset(f,0x3f,sizeof(f));
memset(g,0x3f,sizeof(g));
for(i=0;i<=mask;i++){
for(j=1;j<=n;j++){
f[i]=min(f[i],dis[i][j]);
}
}
for(i=0;i<=mask;i++){
k=0;
for(j=1;j<=p;j++){
if(i&(1<<j-1)){
k|=s[b[j].num];
}
}
g[i]=f[k];
}
for(i=0;i<=mask;i++){
for(j=i&(i-1);j;j=i&(j-1)){
g[i]=min(g[i],g[j]+g[i-j]);
}
}
printf("%d\n",g[mask]);
}

BZOJ_4006_[JLOI2015]管道连接_斯坦纳树的更多相关文章

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

    管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...

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

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

  3. BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)

    明显是一道斯坦纳树的题. 然而这题只需要属性相同的点互相连接. 我们还是照常先套路求出\(ans[s]\). 然后对\(ans[s]\)做子集DP即可. 具体看代码. #include<iost ...

  4. 【bzoj4006】[JLOI2015]管道连接(斯坦纳树+dp)

    题目链接 题意: 给出\(n\)个点,\(m\)条边,同时给出\(p\)个重要的点以及对应特征. 现在要选出一些边,问使得这\(p\)个所有特征相同的点相连,问最小代价. 思路: 斯坦纳树的应用场景一 ...

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

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

  6. [JLOI2015]管道连接(斯坦纳树)

    [Luogu3264] 原题解 多个频道,每个频道的关键点要求相互联通 详见代码,非常巧妙 #include<cstdio> #include<iostream> #inclu ...

  7. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

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

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

  9. [BZOJ4006][JLOI2015]管道连接 状压dp+斯坦纳树

    4006: [JLOI2015]管道连接 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1020  Solved: 552[Submit][Statu ...

随机推荐

  1. javascript数组特性

    数组是一段线性分配的内存, 它通过整数计算偏移并访问其中的元素. 数组是一种性能出色的数据结构. 1.数组字面量 数组字面量提供了一种非常方便地创建新数组的表示法. 多个用逗号分隔的值的表达式. 数组 ...

  2. 【转载】解决nginx负载均衡的session共享问题

    https://blog.csdn.net/u012081441/article/details/71787164 之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx sessio ...

  3. Angular6.0发布

    Angular v6 新版本重点关注工具链以及工具链在 Angular 中的运行速度问题. Angular v6 是统一整体框架.Material 和 CLI 三大 Angular 组件的第一个版本, ...

  4. PhpStorm服务激活

    日期 服务地址 状态  2018-03-15  http://idea.singee77.com/  使用中

  5. 一道面试题引发的思考(C#值类型和引用类型)

    某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 class Program { struct Point { p ...

  6. 学习了解CyclicBarrier

    CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行.下面是一个学习过程中采用的示例, ...

  7. SpringBoot jar包中资源加载问题

    在IDE下调试怎么也没有发现问题,但是部署到服务器上,提示找不到资源,找了半天资料总算是找到了原因: Jar包中的资源加载不能使用File方式,只能使用InputStream方式读取.知道原因就好解决 ...

  8. mysql-高级操作

    主键冲突 主键冲突的时候,可以选择更新或者替换进行处理 更新 主键冲突,更新操作. Insert into 表名[(字段列表:包含主键)] values(值列表) on duplicate key u ...

  9. Python 装饰器(Decorator)

    装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...

  10. JS入门熟知

    JS是面向对象的语言 封装 继承 多态 聚集(对象中具有引用其他对象的能力) JS使用中绝大多数情况不需要进行面向对象的设计,很多情况是使用已经设计好,准备好的对象,基于对象的语言. JS的使用(引入 ...