首页 > 其他分享 >Sol.P6192

Sol.P6192

时间:2023-09-12 19:11:07浏览次数:49  
标签:P6192 int Sol 最小 斯坦纳 second edge dp

Upd:开坑了,等会再补

Upd 2023/8/24:补完了!!

Upd:改了很多遍了,希望管理过审或明确帮忙指出一下到底哪行有问题qwq谢谢

题目传送门

前置知识:最小斯坦纳树

最小斯坦纳树可以理解为升级版的最小生成树。

首先给定图 \(G=(V,E)\),以及 \(V\) 的子集 \(U\),\(U\) 中的点为终端节点。最小斯坦纳树即求包含所有终端节点的 \(G\) 的子树中用到边权总和最小的。

  • 在最小斯坦纳树中,若所有顶点都为终端节点,这个问题就是最小生成树问题。

  • 最小斯坦纳树已经被证明是 NP-Hard 问题,所以可能不存在高效算法


举个例子

最小斯坦纳树-图1

如上图,已知其终端节点为 \(A,B,C,F\),则其最小斯坦纳树如下:

最小斯坦纳树-图2


思路:考虑状压DP

可以将 \(dp_{i,s}\) 看作

考虑以下两种转移方式:

  • \(dp_{i,S}=dp_{i,T}+dp_{i,S-T} \quad \quad (T\subseteq S )\)

  • \(dp_{i,S}=dp_{i,s}+w(i,j)\)

显然只需枚举 \(S\) 的子集 \(T\) 即可,然后发现可以用最短路跑一边,于是故解法为状压DP+最短路

代码如下:

#include<bits/stdc++.h>
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define LL long long
using namespace std;
inline int read();
void write(int x);
struct Edge{int to,next,dis;}edge[1010];
int n=read(),m=read(),k=read();
int head[1010],tree[1010],cnt;
int dp[1010][5010],vis[1010],key[1010];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
void add(int u,int v,int w){
	edge[++cnt].next=head[u],edge[cnt].to=v,edge[cnt].dis=w;
	head[u]=cnt,tree[cnt]=v; 
}
#define P pair<int,int>
void dijkstra(int s){
	memset(vis,0,sizeof(vis));
	while(!q.empty()){
		pair<int,int> p=q.top();
		q.pop();	
		if(vis[p.second]) continue;
		vis[p.second]=1;
		for(int i=head[p.second];i;i=edge[i].next){
			if(dp[tree[i]][s]>dp[p.second][s]+edge[i].dis){
				dp[tree[i]][s]=dp[p.second][s]+edge[i].dis;
				q.push(P(dp[tree[i]][s],tree[i]));
			}
		}
	}
}
void init(){
	int u,v,w;
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		add(u,v,w);
		add(v,u,w);
	}
	for(int i=1;i<=k;i++){
		key[i]=read();
		dp[key[i]][1<<(i-1)]=0;
	}
}
int main(){
	//freopen("MST.in","r",stdin);
	//freopen("MST.out","w",stdout);
	init();
	for(int s=1;s<(1<<k);s++){
		for(int i=1;i<=n;i++){
			for(int j=s&(s-1);j;j=s&(j-1))dp[i][s]=min(dp[i][s],dp[i][j]+dp[i][s^j]);
			if(dp[i][s]!=0x3f) q.push(P(dp[i][s],i));	
		}
		dijkstra(s);
	}
	write(dp[key[1]][(1<<k)-1]); 
	return 0;
}
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
    	x=x*10+ch-'0';
		ch=getchar();
	}
    return x*f;
}
void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    return;
}

标签:P6192,int,Sol,最小,斯坦纳,second,edge,dp
From: https://www.cnblogs.com/JacoAwA/p/P6192.html

相关文章

  • 提取.NET开发的DLL中的类为json文件工具软件ConsoleApp_Dll_Class2Json_V1.0开源了
    提取.NET开发的DLL中的类为json文件工具软件ConsoleApp_Dll_Class2Json_V1.0开源了同步在github和gitee上面发布。github https://github.com/binghe021/ConsoleApp_Dll_Class2Jsongitee https://gitee.com/binghe021/ConsoleApp_Dll_Class2Json......
  • sol. CF1680F Lenient Vertex Cover
    CF1680FLenientVertexCover下面用\(G\)表示一个环的边集,记作环\(G\)。我们令一个环\(G\)的价值为它经过的返祖边数量,记作\(Z(G)\),下面给出核心结论:若存在一条边\(e_0\)经过所有\(Z(G)=1\)的奇环,且不经过任意一个\(Z(G)=1\)的偶环,那么\(e_0\)经过所有奇环......
  • Springboot项目中pom.xml配置文件无法解析下载oracl数据库解决办法(Cannot resolve com
    网上说是因Oracle的版权问题,导致maven下载不下来ojdbc各个版本的jar包。就会报错Cannotresolvecom.oracle:ojdbc6:11.2.0.1.0 经过一番百度,找到了一个适用的解决方法,如下操作即可:1.在终端或客户端机器上找到oracle安装驱动目录:例如:E:\myorcl\product\11.2.0\dbhome_1\j......
  • solidworks 2023 SP3.0 安装笔记
    参考文献:Crack自带readme.txthttps://mp.weixin.qq.com/s?__biz=Mzk0NjI3ODE4OQ==&mid=2247592805&idx=1&sn=a8af2a6130ebb82972d2e09df555a90b&chksm=c30bb127f47c3831e9a82129098132c06ba8d083f8cbe0085a293874efdd20ff92434d8d1fcc&scene=21#wechat_redir......
  • Solidity-变量和数据类型[复合类型_1]
    复合类型的数据包括:array(数组)、struct(结构体)和mapping(映射),其中array和struct也称为引用类型。复合类型数组(array)数组(array)是一种用于存储相同类型元素的集合,分为固定长度的静态数组和长度可变的动态数组。需要注意的是,数组中的元素类型不能是映射类型(mapping),因为映射类型本身......
  • 报错解决 :Resolved [org.springframework.web.bind.MissingServletRequestParameterE
    报错解决:Resolved[org.springframework.web.bind.MissingServletRequestParameterException解决方法:RequestParam注解加上required=false属性。这样请求参数可以传null对象。如果没有加上required=false属性,这样请求参数传""空字符串也不会报错。如果没有加上required=......
  • 如何在SOLIDWORKS中更改单位-硕迪科技
    SOLIDWORKS中的单位系统SOLIDWORKS中的单位系统可以针对单个文件修改、一次修改多个文件以及在默认模板中进行修改。每个SOLIDWORKS文件都有一个单位系统,该单位系统由该文件的文档属性控制。默认情况下,SOLIDWORKS零件、装配体和工程图模板各自规定了文件的单位制。如果您使用的是公......
  • 解决Found multiple records While trying to resolve alternate key.
    这是我的第503篇原创文章,写于2023年9月7日。碰到一个奇怪的问题,用户在界面上更新记录不报错,但是通过代码使用WebAPI来更新代码会报错,使用的是普通的更新代码:varclientUrl=Xrm.Utility.getGlobalContext().getClientUrl();varreq=newXMLHttpRequest();varrequestData={......
  • 使用GO 程序指定IP地址访问 http/https 地址 类似curl --resolve XXXIP:PortYYY
    需求,使用GO程序指定IP地址访问http/https地址传入参数:ipAddr//ipv4地址string值serviceUrl//url地址string值hostContainPort//HostHeader是否带url的端口bool值返回值:responseCode//http状态码int类型,Host//request请求HostHeaderstring类型 ......
  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external depend
    文章目录一、报错信息二、解决方案目前使用的是最新的Gradle配置,创建Module生成的源码与Gradle配置出现了冲突,导致的问题;解决此类问题,要仔细检查Gradle构建脚本,排查每个依赖库的来源;本次错误就是AS系统自动成的Module修改了Gradle构建脚本,导......