最小生成树的Kruskal算法-详解

article/2025/9/16 10:47:27

最小生成树的Kruskal算法


一、 什么是最小生成树


1.1 最小生成树定义:

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。


1.2 例子:
在这里插入图片描述
在这里插入图片描述

通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离


1.3 理解 最小生成树:

将最小生成树拆分成: 最小 生成 树

树:
• 树中没有环
• 所有的顶点都要在树中
• 对于N条顶点,有N-1条边

最小:
一个图,可以有很多生成树,我们把一棵树的权值相加,得到权值和。因此不同的生成树就会有不同的权值和,而最小生成树就是权值和最小生成树。


1.4 如何求最小生成树?

• Kruskal算法(克鲁斯卡尔),直接选择权值最小的边

• Prim算法(普里姆算法) 从顶点出发间接选择权值最小的边

二、Kruskal算法(克鲁斯卡尔)求解最小生成树

第一步:

将图中所有的边,都取出放入一个列表中。并按照边的权值由小到大的顺序排序
在这里插入图片描述

第二步:

初始化,查源数组(并查集),判断当前图是否存在环
在这里插入图片描述

第三步:

回贴过程,按次序每次取出一条边,回帖到图中,每回帖一条新边都要进行判断,当前图的状态中是否存在环。
利用查源数组(并查集)来判断当前图是否存在环

回帖A–B

(1)查源:
        1.A : 1–1 源头:A
        2.B : 2–2 源头:B
        3.A,B不同源,即无环
(2)权值和 =4
(3)把 源头 A 对应查源数组的下标的值,改为 源头 B
在这里插入图片描述

回帖A–C
  1. 查源:
    (1)A : 1–2 源头:B
    (2) C : 3–3 源头:C
    (3)A,C不同源,即无环
  2. 权值和 = 4+5
  3. 把 源头 B 对应查源数组的下标的值,改为 源头 C
    在这里插入图片描述
回帖B–C
  1. 查源:
    (1) B : 2–3 源头:C
    (2)C : 3–3 源头:C
    (3)A,C同源,有环。跳过

    最小生成树为:
    在这里插入图片描述
    最小权值和=9
    注:其实直接可以设置,回帖图的边的数目到达N-1时即可退出程序。

三、 最小生成树的Kruskal算法代码

/**
...project: Kruskal算法的设计
...time:    09/05/2020
...author:  @DUDU
**/#include<iostream>
using namespace std;
char node[1000];/**  (1)图的存储结构  **/
//节点集 
typedef struct Node{char a,b;  //起点和终点 int w;     //权值 
}Node; 
//边集
typedef struct{int len,n;  //长度和顶点的个数 Node *list; //指针 
}Graph;/**  (2)线性表的初始化  **/
int InitList(Graph &G){G.len=0;G.list=new Node[1000];return 0;
} /**  (3)线性表赋初值 **/
int GetList(Graph &G){cout<<"输入节点的个数和边的条数"<<endl;cin>>G.len>>G.n;cout<<"输入节点的名称"<<endl;for(int i=1;i<=G.len;i++)cin>>node[i];cout<<"输入边起点,终点,权值"<<endl;G.list[0].w=0;for(int i=1;i<=G.n;i++)cin>>G.list[i].a>>G.list[i].b>>G.list[i].w;return 0;
} /**  线性表的按权值插入排序 **/
int InsertList(Graph G){int j=0;for(int i=2;i<=G.n;i++){if(G.list[i].w<G.list[i-1].w){G.list[0]=G.list[i];G.list[i]=G.list[i-1];for(j=i-2;G.list[0].w<G.list[j].w;j--)G.list[j+1]=G.list[j];G.list[j+1]=G.list[0];}		   }return 0;
}/**  (4)查找源头  **/
int GetRoot(Graph G,int V[],char x){int y;//将要查询的数转化为并查集数for(int i=1;i<=G.len;i++)if(node[i]==x)y=i;//查源 while(V[y]!=y)y=V[y];cout<<x<<"的源头为:"<<y<<endl; return y;}/** 输(5)出选择路径  **/
int Pop(Graph G,int data[],int t){int m;//输出 cout<<"选择的边和权值为:"<<endl; for(int i=0;i<t;i++){m=data[i];cout<<G.list[m].a<<"-->"<<G.list[m].b<<" :"<<G.list[m].w<<endl; }return 0;
}/**  Kruskal算法  **/
int Kruskal(Graph G){//记录最短路径 int sum=0,t=0;  int data[1000];//并查集int V[1000]; //并查集初始化 for(int i=1;i<=G.len;i++)V[i]=i;//算法核心 for(int i=1;i<=G.n;i++){int v1,v2;//查找源头v1=GetRoot(G,V,G.list[i].a); //起点源头 v2=GetRoot(G,V,G.list[i].b); //终点源头 if(v1!=v2){sum+=G.list[i].w;V[v1]=v2; //A--C: V[A的源头B] = C的源头Cfor(int k=1;k<=3;k++)cout<<"V["<<k<<"]="<<V[k]<<endl;data[t]=i; //记录回帖的边 t++;}} Pop(G,data,t);return sum;
}int main(){Graph G;InitList(G);GetList(G);InsertList(G);cout<<"最短路径为: "<<Kruskal(G);return 0;
} 

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

相关文章

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

最小生成树 本文参考自《大话数据结构》 一个连通图的生成树是一个极小的连通子图&#xff0c;它含有图中全部的顶点&#xff0c;但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树 。 找连通网的最小生成树&#xff0c;经典的有两种算法&#…

最小生成树怎么画?

介绍最小生成树的图形画法~以下图为例&#xff1a; 1、从1开始&#xff0c;以1为顶点画圈。在红色线经过的部分中&#xff0c;可见权重分别为6、1、5&#xff0c;最小权重为1。如下图。 2、以上图中得到的1、3为顶点的图中&#xff0c;继续画线&#xff0c;图为黄色线部分。经过…

最小生成树算法

最小生成树算法 生成树的概念最小生成树算法Prim算法Kruskal算法 生成树的概念 若图是连通的无向图或强连通的有向图&#xff0c;则从其中任一顶点出发&#xff0c;调用一次 d f s dfs dfs或者 b f s bfs bfs后&#xff0c;可以系统的访问图中所有顶点。若图是有根的有向图 &a…

【图】最小生成树

最小生成树&#xff1a;构造连通网的最小代价生成树。 最小生成树有两种算法&#xff1a;普利姆算法、克鲁斯卡尔算法。 普利姆&#xff08;Prim&#xff09;算法 加点&#xff0c;选择相邻点中边权最小的 需要两个一维数组&#xff0c;一个存权值&#xff0c;另一个存起始点…

最小生成树-Kruskal算法

数据结构:最小生成树-Kruskal算法 什么是最小生成树&#xff0c;最小生成树就是求图中把所有点都访问到的最短路径的长度 Kruskal算法采用的是边贪心思想&#xff0c;我们先大概讲一下它的大概思想&#xff0c;首先我们先假设先隐藏所有的边&#xff0c;这样每个点会成为一个连…

最小生成树(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操作系统的防火墙好关闭…