最小生成树-Kruskal算法

article/2025/9/16 11:20:23

数据结构:最小生成树-Kruskal算法

什么是最小生成树,最小生成树就是求图中把所有点都访问到的最短路径的长度
Kruskal算法采用的是边贪心思想,我们先大概讲一下它的大概思想,首先我们先假设先隐藏所有的边,这样每个点会成为一个连通块。

步骤1:先对图中所有的边按照权值进行排序
步骤2:如果当前这条边的两个顶点不在一个连通块里面,那么咋就用并查集的Union函数把他们合并在一个连通块里面(也就是把他们放在最小生成树里面),如果再在一个并查集里面,我们就舍弃这条边,不需要这条边。
步骤3:一直执行步骤2,知道当边数等于定点数的数目减去1,那就说明这n个顶点就连合并在一个集合里面了;如果边数不等于顶点数目减去1,那么说明这些边就不连通。

现在,我们通过几个图来看一下,Kruskal求最小生成树是怎么求的。不要眨眼啊!!!!

在这里插入图片描述
1.我们看一下这个图,把所有的边进行排序,先假设把所有边先隐藏掉,排完序后的边的权值是:10 12 14 16 18 22 24 25 28;
2.我们先找到的是权值10的边的两个顶点是0和5,先将0和5这两条边合在一个集合里面,并且连上一条边。
在这里插入图片描述
2.找到第二个最小的边的权重是12,连接的是2和3,现在我们把这两条边连起来,并且合并在一个集合里面。
在这里插入图片描述
3.同理,把1和6连接起来并合并
在这里插入图片描述
4.同理,把1和2连接起来并合并
在这里插入图片描述
5.这个时候权值是18,注意一下,因为6和3已经在一个集合里面,我们就直接跳过,不用处理。

6.下一个连接和合并是3和4
在这里插入图片描述
7.注意一下,此时4和6在一个集合里面了,我们直接跳过
8.我们连接并合并4和5两个顶点
在这里插入图片描述
此时到这里面,我们的边数等于顶点数目减去1,退出。
这个就是最小生成树的生成过程,可以用个ans记入每次连边时候的权值,就能得到最小的权值。
先给个题目连接:https://www.luogu.com.cn/problem/P3366
可以自己先尝试一下》》》》
下面附上我的代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000001;
int father[maxn];//father数组存放的是父亲结点
struct Edge{int u;//左端点int v;//右端点int dis;//权值
}ed[maxn];
bool cmp(Edge a,Edge b){//结构体排序return a.dis < b.dis;
}
void init(int n){//初始化for(int i=1;i<=n;i++) father[i] = i;
}
int find_father(int x){//并查集核心操作if(x==father[x]) return x;int temp = find_father(father[x]);//路径压缩return temp;
}
int Kruskal(int n,int m){int ans = 0;//记入最小生成树的权值int num_Edge = 0;//边的数目for(int i=0;i<m;i++){int fu = find_father(ed[i].u);//找最终父亲int fv = find_father(ed[i].v);//找最终父亲if(fu!=fv){father[fu] = fv;//合并ans+=ed[i].dis;num_Edge++;if(num_Edge==n-1) break;}}if(num_Edge!=n-1) return -1;//退出条件else return ans;
}
int main(){int n,m;cin>>n>>m;init(n);for(int i=0;i<m;i++) cin>>ed[i].u>>ed[i].v>>ed[i].dis;//输入sort(ed,ed+m,cmp);//排序cout<<Kruskal(n,m);return 0;
}

感谢张大佬的审核!!!


http://chatgpt.dhexx.cn/article/a76DxIG3.shtml

相关文章

最小生成树(kruskal算法)

一、概述 最小生成树问题顾名思义&#xff0c;概括来说就是路修的最短。 接下来引入几个一看就明白的定义&#xff1a; 最小生成树相关概念&#xff1a; 带权图&#xff1a;边赋以权值的图称为网或带权图&#xff0c;带权图的生成树也是带权的&#xff0c;生成树T各边的权值…

最小生成树、最短路径树

一、最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小&#xff0c;但不能保证任意两点之间是最短路径。 应用如网络部线&#xff0c;把所有的电脑(服务器&#xff1f;&#xff09;都连起来用的网线(光纤&#xff1f;&#xff09;最少&#xff0c…

【图解算法】最小生成树

今天我们介绍图论中的另一部分&#xff0c;最小生成树。 对图的最短路感兴趣的同学可以看&#xff1a; 【图解算法】一次解决最短路径问题 目录 1. 最小生成树简介2. Prim算法2.1 模板题2.2 思路模板2.3 代码实现2.3 prim 算法的优化 3. Kruskal算法3.1 模板题3.2 思路模板3.3…

数据结构—最小生成树

目录 一、生成树 二、最小生成树&#xff08;代价最小树&#xff09; 三、求最小生成树 1、Prim算法&#xff08;普里姆&#xff09; 2.Kruskal 算法&#xff08;克鲁斯卡尔&#xff09; 3.Prim算法和Kruskal算法对比 一、生成树 连通图的生成树是包含图中全部顶点的一个…

最小生成树详解

目录 最小生成树简介 什么是树 什么是生成树 什么是最小生成树 最小生成树的做法 Kruscal&#xff08;克鲁斯卡尔&#xff09;算法 思路 代码 其他算法 最小生成树简介 什么是树 树&#xff08;tree&#xff09;是一种特殊的图&#xff0c;一个图要成为树要满足三个条…

最小生成树的实现(C语言)

今天做洛谷的时候刷到好多图论的题&#xff0c;发现自己在这一方面算法的掌握还是有待提高啊。在这就先介绍最小生成树的算法吧。 最小生成树 最小生成树&#xff08;minimum spanning tree&#xff09;是由n个顶点&#xff0c;n-1条边&#xff0c;将一个连通图连接起来&…

详解: 最小生成树

详解: 最小生成树算法 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;是在一个给定的无向图G(V, E)中求一棵树&#xff0c;使得这棵树有图G的所有顶点&#xff0c;且所有边都来自图G中的边&#xff0c;并且满足整棵树的边权之和最小. 最下生成树满足如下性质…

最小生成树

目录 一、最小生成树定义&#xff1a; 二、普里姆算法&#xff08;Prim&#xff09; 三、Kruskal算法&#xff08;克鲁斯卡尔&#xff09; 小结&#xff1a; 下一篇&#xff1a;最短路径算法 问题&#xff1a; 一、最小生成树定义&#xff1a; 对于一个带权连通无向图G(V,E)&am…

最小生成树——Prim算法(详细图解)

目录 最小生成树的概念 经典题目 prim算法简介 prim算法解析 &#xff08;详细图解&#xff09; 代码实现 代码实战 最小生成树的概念 在一给定的无向图G (V, E) 中&#xff0c;(u, v) 代表连接顶点 u 与顶点 v 的边&#xff0c;而 w(u, v) 代表此的边权重&#xff0c;若…

最小生成树入门(图解)

1.什么是最小生成树 来看百度百科的定义 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n个结点&#xff0c;并且有保持图连通的最少的边。最小生成树可以用kruskal&#xff08;克鲁斯卡尔&#xff09;算法或prim&#xff08;普里姆&am…

最小生成树(Prim、Kruskal)算法,秒懂!

前言 在数据结构与算法的图论中&#xff0c;(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法。但是可能很多人对概念不是很清楚&#xff0c;什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&…

最小生成树详解(模板 + 例题)

作为一个伪ACMer,先来首广为人知的打油诗: 模拟只会猜题意&#xff0c;贪心只能过样例&#xff0c;数学上来先打表&#xff0c;规律一般是DP&#xff0c;组合数学碰运气&#xff0c;计算几何瞎暴力&#xff0c;图论一顿套模板&#xff0c;数论只会GCD,递归递推伤不起&#xff0…

Linux开启/关闭防火墙

一、查看防火墙状态&#xff1a; systemctl status firewalldinactive表示防火墙为关闭状态。 二、开启防火墙&#xff1a; systemctl start firewalld启动后无任何提示&#xff0c;再次查看防火墙状态&#xff0c;可以看到变成active&#xff0c;成功启动。 三、关闭防火墙…

linux服务器查看防火墙是否关闭,linux查看防火墙是否关闭了的方法

linux查看防火墙是否关闭了的方法 发布时间&#xff1a;2020-04-02 10:49:28 来源&#xff1a;亿速云 阅读&#xff1a;62 作者&#xff1a;小新 今天小编给大家分享的是linux查看防火墙是否关闭了的方法&#xff0c;很多人都不太了解&#xff0c;今天小编为了让大家更加了解li…

linux操作系统关闭防火墙,linux操作系统关闭防火墙的方法

防火墙是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的数据通过。简单的来说防火墙的作用就是保护你的网络免受非法用户的侵入,虽然防火墙是为了你网络安全而存在,但是同时也限制了你上网操作,有很多人会选择关闭防火墙,windows操作系统的防火墙好关闭…

linux为什么要关闭防火墙,Linux怎么样关闭防火墙

Linux系统下面自带了防火墙iptables&#xff0c;iptables可以设置很多安全规则。但是如果配置错误很容易导致各种网络问题&#xff0c;那么如果要关闭禁用防火墙怎么操作呢?下面就让学习啦小编给大家说说Linux怎么关闭防火墙吧。 Linux关闭防火墙的方法 如果启动的iptables防火…

linux防火墙的开启、关闭、永久关闭

防火墙是什么&#xff1f;我们为什么需要关闭防火墙&#xff1f; 防火墙就是一个保护我们系统的软件服务&#xff0c;默认开启&#xff0c;但是我们在实际开发中&#xff0c;如果需要使用宿主机来连接虚拟机里面的redis, mysql&#xff0c;nginx&#xff0c;tomcat等服务&#…

linux防火墙能关吗,linux防火墙怎么样关闭

有没有什么方法可以关闭linux防火墙呢?方法是有的&#xff0c;小编来告诉你!下面由学习啦小编给你做出详细的linux防火墙关闭方法介绍!希望对你有帮助! linux防火墙关闭方法一&#xff1a; 1) 重启后生效 开启&#xff1a; chkconfig iptables on 关闭&#xff1a; chkconfig …

Linux防火墙关闭(重启)操作(centos)

1:查看防火墙状态 systemctl statu firewalld 此状态表示防火墙禁用状态 此状态表示防火墙处于开启状态 2:暂时关闭防火墙 systemctl stop firewalld 3:启用防火墙&#xff08;关闭状态使用&#xff09; systemctl start firewalld 4:重启防火墙&#xff08;输入命令后防火墙先…

Linux 开启关闭防火墙操作

1. linux中防火墙相关操作 1.1 查看防火墙状态 systemctl status firewalld如下所示表示防火墙是运行状态&#xff0c; 8080&#xff0c; 3306&#xff0c; 6379表示我开放了这个端口给外部访问 或者 firewall-cmd --state1.2 暂时关闭防火墙(重启服务器防火墙会重新开启) …