首页 > 其他分享 >最小生成树相关技术

最小生成树相关技术

时间:2024-12-23 10:54:05浏览次数:3  
标签:int Kruskal 最小 生成 vis ans 相关

注意只有连通图才有生成树,图不连通就只有生成森林。

最小生成树的板子

Kruskal

基本思想是按边权从小到大加边,是贪心思想。

时间复杂度\(O(m\log m)\)。

板子
sort(e+1,e+tot+1,cmp);
for(int i=1;i<=tot;++i){
	int u=e[i].u,v=e[i].v;
	u=find(u),v=find(v);
	if(u==v) continue;
	fa[v]=u;
	ans+=g[i].w;
	if(--n<2) break;//总共只能加入n-1条边
}

Prim

基本思想是从一个点开始,不断加点。

具体而言,每次找距离已经确定的最小生成树部分最小的点加入最小生成树,并更新其他点到已确定的最小生成树部分的距离。

暴力的时间复杂度为\(O(n^2+m)\),堆优化的时间复杂度为\(O((n+m)\log n)\)。

暴力板子
#include<bits/stdc++.h>

using namespace std;

const int maxn=5e3+10,maxm=2e5+10,inf=1e9+7;
int n,m,tot,ans,head[maxn],dis[maxn];
bool vis[maxn];
struct edge{
	int v,w,nxt;
}e[maxm<<1];

void add(int u,int v,int w){
	e[++tot].v=v;
	e[tot].w=w;
	e[tot].nxt=head[u];
	head[u]=tot;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) dis[i]=inf;
	dis[1]=0;
	for(int i=1;i<=m;++i){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	queue<int> q;
	q.push(1);
	vis[1]=true;
	ans=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(vis[v]) continue;
			vis[v]=true;
			q.push(v);
			ans++;
		}
	}
	if(ans!=n){
		puts("orz");
		exit(0);
	}
	ans=0;
	for(int i=1;i<=n;++i) vis[i]=false;
	for(int i=1;i<=n;++i){
		int mini=inf,u=0;
		for(int j=1;j<=n;++j){
			if(dis[j]<mini&&!vis[j]) mini=dis[j],u=j;
		}
		ans+=mini;
		vis[u]=true;
		for(int j=head[u];j;j=e[j].nxt){
			int v=e[j].v,w=e[j].w;
			if(dis[v]>w) dis[v]=w;
		}
	}
	printf("%d\n",ans);
	return 0;
}
堆优化Prim板子
void Prim() {
  memset(dis,0x3f,sizeof(dis));
  dis[1]=0;
  q.push({1,0});
  while(!q.empty()){
    if(cnt>=n) break;
    int u=q.top().u,d=q.top().d;
    q.pop();
    if(vis[u]) continue;
    vis[u]=1;
    ++cnt;
    res+=d;
    for (int i=h[u];i;i=e[i].x){
      int v=e[i].v,w=e[i].w;
      if(w<dis[v]) dis[v]=w,q.push({v,w});
    }
  }
}

Boruvka

某B开头的神秘MST算法。

在处理完全图上/边有很多特殊性质的MST时,Boruvka的思想很好用(虽然我们一般不会真的去写它)。

主要思想是每次找到每个连通块连上的最小的边,把它加入边集,然后不断重复,直到只有一个连通块。

初始时每个点都被视作独立的联通块。

就酱。

相关的技术

Kruskal重构树

我们在Kruskal的过程中建一棵树出来。

Kruskal从小到大加边,每次加边会合并两个集合,我们新建一个点,点权设为边权,左右儿子设为两个集合的根,然后把两个集合合并,以新建节点为根。

性质

原图上的每个点都是叶子,点权为\(0\)。

原图上两点间所有简单路径上最大边权的最小值=最小生成树上两点间的简单路径上的最大边权=Kruskal重构树上两点LCA的权值。

从一个点\(x\)到根的路径上的点权是单增的。

到点\(x\)的简单路径上最大边权的最小值\(\le val\)的点都在\(x\)到根的链上的某个点的子树内,且为该子树的所有叶子节点,且这个点满足点权\(\le val\)且最浅的。

要是将Kruskal的过程换成从大到小加边,则性质是类似的,“最大的最小”会变成“最小的最大”,其他推一下,其实很一眼。

把重构树建出来后就以解决树上问题的方式做。

P1967 [NOIP2013 提高组] 货车运输

标签:int,Kruskal,最小,生成,vis,ans,相关
From: https://www.cnblogs.com/EmilyDavid/p/18623455

相关文章

  • Solana靓号地址生成器
    现实生活中,有人追求手机号“111111”,而在区块链中,大家也追求“靓号地址”。靓号地址(VanityAddress)指的是包含特定字符或字符序列的加密货币地址,这些地址通常具有某种特殊的意义或美观性。如何生成自己的靓号地址呢?solana很可爱,已经为我们准备好了工具。安装SolanaClisola......
  • 写一个方法找出两个数的最小公倍数
    在前端开发中,你可以使用JavaScript来写一个方法找出两个数的最小公倍数(LeastCommonMultiple,LCM)。最小公倍数可以通过两数的乘积除以它们的最大公约数(GreatestCommonDivisor,GCD)来得到。以下是一个简单的JavaScript函数,用于计算两个数的最小公倍数:functiongcd(a,b){......
  • 深入探索人工智能的技术热点:生成式AI、强化学习与AI算法优化
    人工智能(AI)技术在不断发展中,带来了许多突破性的进展。我们看到了生成式AI在图像、文本生成等领域的广泛应用,也见证了强化学习在复杂决策问题中的成功实践。同时,随着AI技术逐渐走向实际应用,算法优化与效率提升成了新的技术焦点。在这篇博客中,我们将重点讨论目前在人工智能领域的......
  • .NET 9 New features-AOT相关的改进
    上一篇文章给大家介绍了.NET9Newfeatures-JSON序列化 本篇文章,研究分享一下关于AOT方面的改进1.什么是AOTAOT(Ahead-of-Time)编译是一种在应用程序部署之前,将高级语言代码直接编译为本机机器代码的技术。与传统的即时编译(Just-In-Time,JIT)不同,AOT在应用程序运行之前完成编......
  • AI文字界面描述生成原型与前端代码
    场景   之前文章也有介绍AI助力生成原型与UI前端代码第一回代码自动生成:AI大模型可以根据用户提供的文字界面描述,自动生成前端代码,如HTML、CSS和JavaScript。这种自动化过程显著减少了手动编写代码的时间和工作量,提高了开发效率。例如,开发者只需提供界面的草图或描述性语言,AI......
  • "该系统对指定的帐户没有授权,因此无法完成此操作。请使用与此帐户相关联的提供程序重
    使用net命令改不了用户口令通过mmc添加用户管理模块没有在计算机管理中也没有用户管理查看设置里目前只用了这两种登录方式并且下面的“仅允许使用windowshello登录”是打开的当关掉上面选项后就出现密码登录功能了......
  • 【编译原理】编译原理知识点汇总·词法分析器(正则式到NFA、NFA到DFA、DFA最小化)
    ......
  • 深入解析RuoYi框架中的DataScopeAspect:不同权限类型的SQL语句生成与作用
    目录AOP简介面向切面编程(AOP)的概念AOP在RuoYi框架中的应用DataScopeAspect类的作用类的功能切点选择权限检查​编辑在前端如何给不同的用户设置不同的权限实际代码示例控制层服务层Mapper层DataScopeAspect类1.全部权限2.自定义权限3. 本部门及以下权限4.仅......
  • 在SpringBoot项目中优雅地记录日志(日志框架选型、SpringBoot默认的日志实现框架、如何
    文章目录1.前言2.日志框架选型2.1System.out.println2.2SLF4J2.2.1Log4j(已停止维护,不再介绍)2.2.2LogBack&Log4j22.3扩展:日志框架背后的故事3.SpringBoot默认的日志实现框架(Logback)4.如何使用日志框架4.1常规方法4.2使用Lombok工具库提供的@Slf4j注解4.3......
  • Averaging Weights Leads to Wider Optima and Better Generalization(SWA2018-2019)平
    第一部分:解决的问题论文解决的是深度神经网络优化过程中模型的泛化能力提升问题。具体来说:背景问题:在深度学习中,SGD(随机梯度下降)及其变种是主要的优化方法,但其找到的解通常在权重空间中是“尖锐(参数稍微变一点损失函数就会变化很大)的”(sharpminima),对模型泛化性能有负面影......