BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)
明显是一道斯坦纳树的题。
然而这题只需要属性相同的点互相连接。
我们还是照常先套路求出\(ans[s]\)。
然后对\(ans[s]\)做子集DP即可。
具体看代码。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=1e9;
const int N=1111;
const int M=3333;
struct edge{
	int to,nxt,w;
}e[M*2];
int cnt,head[N];
void add_edge(int u,int v,int w){
	cnt++;
	e[cnt].nxt=head[u];
	e[cnt].to=v;
	e[cnt].w=w;
	head[u]=cnt;
}
struct node{
	int id,w;
	node(int idd=0,int ww=0){
		id=idd,w=ww;
	}
};
struct point{
	int k,id;
}c[N];
bool operator <(node a,node b){
	return a.w>b.w;
}
priority_queue<node> q;
bool vis[N];
int dp[N][N];
void dij(int x){
	memset(vis,0,sizeof(vis));
	while(!q.empty()){
		node uu=q.top();
		q.pop();
		int u=uu.id;
		if(vis[u])continue;vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(dp[x][v]>dp[x][u]+e[i].w){
				dp[x][v]=dp[x][u]+e[i].w;
				q.push(node(v,dp[x][v]));
			}
		}
	}
}
int a[15],num[15];
int n,m,k,tot,ans[N];
bool check(int s){
	for (int i=1;i<=k;++i) a[i]=0;
	for (int i=1;i<=k;++i)
		if (s&(1<<(i-1))) a[c[i].k]++;
	for (int i=1;i<=k;++i) if (a[i]&&a[i]!=num[i]) return false;
	return true;
}
int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return sum*f;
}
int main(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),w=read();
		add_edge(u,v,w);add_edge(v,u,w);
	}
	tot=(1<<k)-1;
	for(int i=0;i<=tot;i++)
		for(int j=1;j<=n;j++)
			dp[i][j]=INF;
	for(int i=1;i<=k;i++){
		c[i].k=read(),c[i].id=read();
		num[c[i].k]++;
	}
	for(int i=1;i<=k;i++)dp[1<<i-1][c[i].id]=0;
	for(int t=0;t<=tot;t++){
		for(int i=1;i<=n;i++)
			for(int j=t;j;j=(j-1)&t)
				dp[t][i]=min(dp[t][i],dp[j][i]+dp[t^j][i]);
		for(int i=1;i<=n;i++)if(dp[t][i]!=INF)q.push(node(i,dp[t][i]));
		dij(t);
	}
	for(int i=0;i<=tot;i++){
		ans[i]=INF;
		for(int j=1;j<=n;j++)
			ans[i]=min(ans[i],dp[i][j]);
	}
	for(int i=0;i<=tot;i++)
		if(check(i))
			for(int j=i;j;j=(j-1)&i)
				if(check(j))
					ans[i]=min(ans[i],ans[j]+ans[j^i]);
	printf("%d",ans[tot]);
	return 0;
}
												
											BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)的更多相关文章
- bzoj 4006 [JLOI2015]管道连接——斯坦纳树
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 除了模板,就是记录 ans[ s ] 表示 s 合法的最小代价.合法即保证 s 里同一 ...
 - BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)
		
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...
 - 洛谷P3264 [JLOI2015]管道连接 (斯坦纳树)
		
题目链接 题目大意:有一张无向图,每条边有一定的花费,给出一些点集,让你从中选出一些边,用最小的花费将每个点集内的点相互连通,可以使用点集之外的点(如果需要的话). 算是斯坦纳树的入门题吧. 什么是斯 ...
 - BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
		
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
 - 【BZOJ4774/4006】修路/[JLOI2015]管道连接 斯坦纳树
		
[BZOJ4774]修路 Description 村子间的小路年久失修,为了保障村子之间的往来,法珞决定带领大家修路.对于边带权的无向图 G = (V, E),请选择一些边,使得1 <= i & ...
 - BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
		
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
 - 【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个点中同颜色的 ...
 - bzoj 4006 管道连接 —— 斯坦纳树+状压DP
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
 
随机推荐
- 训练1-T
			
一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数.求所有小于等于N的与7无关的正整数的平方和. 例如:N = 8,<= 8与7无关的数包括:1 2 ...
 - 《代码敲不队》第八次团队作业:Alpha冲刺 第一天
			
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 掌握软件编码实现的工程要求. 第一天 日期:2019/6/15 团队项目 ...
 - 微信小程序 Image 图片实现宽度100%,高度自适应
			
做法如下: 样式设置宽度100%, .img{ width:100%;} 添加属性 mode="widthFix", <image class="img" ...
 - BA-siemens-PXM液晶面板
			
PXM面板作用:可以查看模块内部的信息,可以触发控制点来近程控制模块上的点位(非常便于现场调试). 优点:1.便于现场紧急控制,有些地方是必须要加上的,如工厂控制等项目,假如机器死机,可以通过面板切换 ...
 - CF909B Segments
			
CF909B Segments 题意翻译 题目描述 给你一个整数N.考虑坐标轴上所有可能的部分,在整数点上的端点,坐标在0到N之间,包括它们. 您希望在几个层中绘制这些片段,这样在每个层中这些片段就不 ...
 - [using_microsoft_infopath_2010]Chapter8 使用InfoPath表单web部件
			
本章概要: 1.配置web part 2.创建web part连接 3.创建表单参数 4.利用其它浏览器表单参数
 - HDU 2035 不忍直视的水
			
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; in ...
 - 11 个 Visual Studio 代码性能分析工具
			
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
 - 我的php站点系统分析工具01
			
出于后的工作需求.须要高速弄清楚整个php站点系统是怎样执行的.抱着试探的心态.写出了这个工具. 临时把它叫做"系统信息动态解析地图"吧,或许"系统信息图"更方 ...
 - 从头认识java-13.5 利用泛型构建复杂模型
			
这一章节我们来展示一下如何利用泛型构建复杂模型? 1.元组列表 我们之前已经说过元组是一个复杂的模型,能够返回多对象. package com.ray.ch11; import java.util.A ...