bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006
用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初值DP即可。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define pb push_back
using namespace std;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=,xm=,xxn=(<<)+,inf=0x3f3f3f3f;
int n,m,hd[xn],ct,to[xm],nxt[xm],w[xm],f[xn][xxn],g[xxn];
int c[],bin[],cnt;
bool vis[xn];
queue<int>q;
vector<int>v[];
int Min(int x,int y){return x<y?x:y;}
void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; w[ct]=z;}
void spfa(int sta)
{
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)if(f[i][sta]<inf)q.push(i),vis[i]=;
while(q.size())
{
int x=q.front(); q.pop(); vis[x]=;
for(int i=hd[x],u;i;i=nxt[i])
if(f[u=to[i]][sta]>f[x][sta]+w[i])
{
f[u][sta]=f[x][sta]+w[i];
if(!vis[u])vis[u]=,q.push(u);
}
}
}
int main()
{
bin[]=; for(int i=;i<=;i++)bin[i]=bin[i-]*;
n=rd(); m=rd(); int K=rd();
for(int i=,x,y,z;i<=m;i++)
x=rd(),y=rd(),z=rd(),add(x,y,z),add(y,x,z);
memset(f,0x3f,sizeof f);
for(int i=,cr,x;i<=K;i++)
{
cr=rd(); x=rd();
if(!c[cr])c[cr]=++cnt;
v[c[cr]].pb(i); f[x][bin[i-]]=;//i!
}
int mx=bin[K];
for(int sta=;sta<mx;sta++)
{
for(int i=;i<=n;i++)
for(int s=(sta&(sta-));s;s=(sta&(s-)))
f[i][sta]=Min(f[i][sta],f[i][s]+f[i][sta^s]);
spfa(sta);
}
memset(g,0x3f,sizeof g); mx=bin[cnt];
for(int sta=;sta<mx;sta++)
{
int s=;
for(int j=;j<=cnt;j++)
if(sta&bin[j-]){for(int k=;k<v[j].size();k++)s|=bin[v[j][k]-];}
for(int j=;j<=n;j++)g[sta]=Min(g[sta],f[j][s]);
}
for(int sta=;sta<mx;sta++)
for(int s=(sta&(sta-));s;s=(sta&(s-)))
g[sta]=Min(g[sta],g[s]+g[sta^s]);
printf("%d\n",g[mx-]);
return ;
}
bzoj 4006 管道连接 —— 斯坦纳树+状压DP的更多相关文章
- 【bzoj4006】[JLOI2015]管道连接  斯坦纳树+状压dp
		题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ... 
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
		Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ... 
- 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\) 首先看数据范围,\ ... 
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
		Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2030 Solved: 986[Submit][Status][ ... 
- 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)
		传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ... 
- 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 管道连接(斯坦纳树生成森林)
		4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ... 
随机推荐
- Gone Fishing(贪心)
			Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ... 
- Qt状态机框架(状态机就开始异步的运行了,也就是说,它成为了我们应用程序事件循环的一部分了)
			状态机框架 Qt中的状态机框架为我们提供了很多的API和类,使我们能更容易的在自己的应用程序中集成状态动画.这个框架是和Qt的元对象系统机密结合在一起的.比如,各个状态之间的转换是通过信号触发的,状态 ... 
- 我的Android进阶之旅------>Android中AsyncTask源码分析
			在我的<我的Android进阶之旅------>android异步加载图片显示,并且对图片进行缓存实例>文章中,先后使用了Handler和AsyncTask两种方式实现异步任务机制. ... 
- linux c编程:信号(四) sigaction
			signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受到了一定的限制.而 POSIX 标准定义的信号处理接口是 sigaction 函数, ... 
- kettle连接资源库设置
			到这里你是登陆不上去的,需要创建或更新按钮,因为需要在你的数据库里创建关于kettle的数据表,来存储资源库 点执行就可以了 一般情况下kettle资源库自动给你创建两个用户: 工具->资源库- ... 
- java基础入门之九九乘法表
			/* 自学java 九九乘法表 Power by Stuart Date: 2015.4.23 */public class Math { public static void main (Strin ... 
- Linux 3 -grep
			七. grep家族: 1. grep退出状态: 0: 表示成功: 1: 表示在所提供的文件无法找到匹配的pattern: 2: 表示参数中提供的文件不存在. 见如下示例: /> grep 'ro ... 
- eclipse中,项目无法在tomcat中发布(project facet java version 1.7 is not supported)
			在tomcat中发布项目时无法添加项目,错误信息:project facet java version 1.7 is not supported,如下图 这是由于你的tomcat的jdk版本低于你项目 ... 
- [转]eclipse中的常用快捷键
			1.选中你要加注释的区域,用ctrl+shift+C 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上注释3.要修改在eclispe中的命令的快捷键方式我们只需进入windo ... 
- CSS知识点  2
			回顾: 浮动:是css中布局最多的一个属性 有浮动,一定要清除浮动浮动不是一个元素单独浮动,要浮动一起浮动 清除浮动四种方式:1.给父盒子添加高度,一般导航栏2.给浮动元素后面加一个空的块标签, 并 ... 
