了解克鲁斯卡尔算法

article/2025/11/10 18:55:50

文章目录

          • Kruskal算法如何工作
          • Kruskal算法的示例
          • Kruskal算法伪代码
          • C示例
          • Kruskal算法 vs Prim算法
          • Kruskal算法的复杂度
          • Kruskal算法的应用
          • 参考文档

    在本教程中,您将学习Kruskal算法如何工作。此外,您还将找到C语言的示例。
    Kruskal算法是一种最小生成树算法,该算法将一个图作为输入并找到该图的边的子集,该子集

  • 形成一棵包含每个顶点的树
  • 在所有可以从图中形成的树中具有最小的权重之和
Kruskal算法如何工作

    它属于一类称为贪心算法的算法,这种算法通过寻找局部最优,希望找到全局最优。
    我们从权重最低的边开始,不断添加边,直到达到目的。
    实现Kruskal算法的步骤如下:

  1. 将所有边按权重从低到高排序
  2. 取权重最小的边并将其添加到生成树中。如果添加边造成了循环,则不使用此边。
  3. 继续添加边,直到到达所有顶点。
Kruskal算法的示例

在这里插入图片描述
    从加权图开始
在这里插入图片描述
    选择权重最小的边,如果有多个边,则任意选择一边
在这里插入图片描述
    选择下一条最短边并添加
在这里插入图片描述
    选择下一条不创建循环的最短边并将其添加
在这里插入图片描述
    选择不创建循环的下一条最短边并添加它
在这里插入图片描述
    重复上述步骤,直到生成一棵生成树

Kruskal算法伪代码

    任何最小生成树算法都围绕添加边是否创建循环来进行。
    最常见的方法是一种称为联合查找(Union-Find)的算法。Union-Find算法将顶点划分为簇,并检查两个顶点是否属于同一簇,从而判断添加边是否创建循环。

KRUSKAL(G):
A = ∅
For each vertex v ∈ G.V:MAKE-SET(v)
For each edge (u, v) ∈ G.E ordered by increasing order by weight(u, v):if FIND-SET(u) ≠ FIND-SET(v):       A = A ∪ {(u, v)}UNION(u, v)
return A
C示例
// Kruskal's algorithm in C#include <stdio.h>#define MAX 30typedef struct edge {int u, v, w;
} edge;typedef struct edge_list {edge data[MAX];int n;
} edge_list;edge_list elist;int Graph[MAX][MAX], n;
edge_list spanlist;void kruskalAlgo();
int find(int belongs[], int vertexno);
void applyUnion(int belongs[], int c1, int c2);
void sort();
void print();// Applying Krushkal Algo
void kruskalAlgo() {int belongs[MAX], i, j, cno1, cno2;elist.n = 0;for (i = 1; i < n; i++)for (j = 0; j < i; j++) {if (Graph[i][j] != 0) {elist.data[elist.n].u = i;elist.data[elist.n].v = j;elist.data[elist.n].w = Graph[i][j];elist.n++;}}sort();for (i = 0; i < n; i++)belongs[i] = i;spanlist.n = 0;for (i = 0; i < elist.n; i++) {cno1 = find(belongs, elist.data[i].u);cno2 = find(belongs, elist.data[i].v);if (cno1 != cno2) {spanlist.data[spanlist.n] = elist.data[i];spanlist.n = spanlist.n + 1;applyUnion(belongs, cno1, cno2);}}
}int find(int belongs[], int vertexno) {return (belongs[vertexno]);
}void applyUnion(int belongs[], int c1, int c2) {int i;for (i = 0; i < n; i++)if (belongs[i] == c2)belongs[i] = c1;
}// Sorting algo
void sort() {int i, j;edge temp;for (i = 1; i < elist.n; i++)for (j = 0; j < elist.n - 1; j++)if (elist.data[j].w > elist.data[j + 1].w) {temp = elist.data[j];elist.data[j] = elist.data[j + 1];elist.data[j + 1] = temp;}
}// Printing the result
void print() {int i, cost = 0;for (i = 0; i < spanlist.n; i++) {printf("\n%d - %d : %d", spanlist.data[i].u, spanlist.data[i].v, spanlist.data[i].w);cost = cost + spanlist.data[i].w;}printf("\nSpanning tree cost: %d", cost);
}int main() {int i, j, total_cost;n = 6;Graph[0][0] = 0;Graph[0][1] = 4;Graph[0][2] = 4;Graph[0][3] = 0;Graph[0][4] = 0;Graph[0][5] = 0;Graph[0][6] = 0;Graph[1][0] = 4;Graph[1][1] = 0;Graph[1][2] = 2;Graph[1][3] = 0;Graph[1][4] = 0;Graph[1][5] = 0;Graph[1][6] = 0;Graph[2][0] = 4;Graph[2][1] = 2;Graph[2][2] = 0;Graph[2][3] = 3;Graph[2][4] = 4;Graph[2][5] = 0;Graph[2][6] = 0;Graph[3][0] = 0;Graph[3][1] = 0;Graph[3][2] = 3;Graph[3][3] = 0;Graph[3][4] = 3;Graph[3][5] = 0;Graph[3][6] = 0;Graph[4][0] = 0;Graph[4][1] = 0;Graph[4][2] = 4;Graph[4][3] = 3;Graph[4][4] = 0;Graph[4][5] = 0;Graph[4][6] = 0;Graph[5][0] = 0;Graph[5][1] = 0;Graph[5][2] = 2;Graph[5][3] = 0;Graph[5][4] = 3;Graph[5][5] = 0;Graph[5][6] = 0;kruskalAlgo();print();
}
Kruskal算法 vs Prim算法

    Prim算法是另一种流行的最小生成树算法,它使用不同的逻辑来寻找图的MST(最小生成树)。Prim的算法不是从一条边开始,而是从一个顶点开始,不断添加树中没有的最小权重边,直到所有顶点都被覆盖。

Kruskal算法的复杂度

    Kruskal算法的时间复杂度为:O(E log E)。

Kruskal算法的应用
  • 布置电气线路
  • 用于计算机网络(LAN连接)
参考文档

[1]Parewa Labs Pvt. Ltd.Kruskal’s Algorithm[EB/OL].https://www.programiz.com/dsa/kruskal-algorithm,2020-01-01.


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

相关文章

克鲁斯卡尔算法

什么是克鲁斯卡尔算法 在知道克鲁斯卡尔算法之前我们先来看一下什么是最小生成树。 最小生成树&#xff1a;在一个有n个结点的无向图中选出最少的边&#xff0c;保证所选边权相加之和最小以及该图中依然有n个结点并且n个结点连通。一共有n个结点&#xff0c;要保证连通&#…

Kruskal算法(克鲁斯卡尔算法)

Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法&#xff0c;由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪心算法的应用。 概念解释 Kruskal算法定义&#xff1a;**先构造一个只含 n 个顶点、而边集为空的子图&…

KruskalAlgorithm(克鲁斯卡尔算法)

KruskalAlgorithm介绍 克鲁斯卡尔(Kruskal)算法&#xff0c;是用来求加权连通图的最小生成树的算法。基本思想&#xff1a;按照权值从小到大的顺序选择 n-1 条边&#xff0c;并保证这 n-1 条边不构成回路具体做法&#xff1a;首先构造一个只含 n 个顶点的森林&#xff0c;然后…

数据结构——克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同&#xff0c;它的时间复杂度为O&#xff08;eloge&#xff09;&#xff08;e为边数&#xff09;&#xff0c;适合于求边稀疏的网的最小生成树 。克鲁斯卡尔算法从另一途径求网的最小生成树。其基本思想是&a…

克鲁斯卡尔(Kruskal)算法(严蔚敏C语言)

克鲁斯卡尔算法(Kruskal) ​ 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同&#xff0c;它的时间复杂度为O&#xff08;eloge&#xff09;&#xff08;e为网中的边数&#xff09;&#xff0c;所以&#xff0c;适合于求边稀疏的网的最小生成树 。 ——百…

4.《学会提问》

1.书中的观点 批判性思维会教你很多技能和态度&#xff0c;让你理性地找到对自己有意义的答案并为此感到自豪。批判性思维鼓励你倾听他人&#xff0c;向别人学习&#xff0c;同时掂量别人所说的话&#xff0c;看看它们的分量如何。如此&#xff0c;你将了解到我们必须要依赖他人…

如何提问——提问的艺术

转存失败重新上传取消https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md

《提问的艺术》读书笔记

分享读《提问的艺术》的xmind总结&#xff0c;每周听一本书&#xff0c;打卡第一周

(转载) 提问的艺术

虽然这是老话常谈&#xff0c;但是最近的回答问题的过程中&#xff0c;有点感触。你问题问的好&#xff0c;问的准确&#xff0c;回答你的人才有积极性给你答复&#xff0c;这样你又可以更快的解决你的问题。好多人不知道如何提问&#xff0c;所以我打算把这篇老文章转过来置顶…

论程序员提问的艺术

最近工作比较忙&#xff0c;加上空闲时间大部分都是在维护开发【云狗AI】&#xff0c;所以也有一段时间没更新视频了&#xff0c;有不懂的&#xff0c;也可以问一下【云狗AI】以后我也会花更多的时间在维护这个项目中。争取给大家带来更好的体验。 主要是因为最近没发现什么特…

提问的艺术[转]

这是刚看到的 所以转一下 也是警示自己的伸手行为 原文&#xff1a;How To Ask Questions The Smart Way 译文链接&#xff1a;提问的艺术 作者&#xff1a; 艾瑞克.史蒂文.雷蒙德(Eric Steven Raymond) <esrthyrsus.com> 瑞克.莫恩(Rick Moen) <respond-autolinuxmaf…

【提问的艺术】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

提问的艺术/怎么高效的提问

唉,可能是因为见过的人多了吧,不管是在现实世界中,还是在网络上,总是需要向别人询问一些东西的, 有的人来问,谦谦有礼,感觉很好,帮助了别人,也没损失什么,有的人来问,就是真心不想搭理他,搭理了他就是 浪费自己的时间,还心理不好受的. 今天不说现实中怎么提问.就说在互联网上.…

《提问的艺术》读后感

前言提问前 他明明能帮到我却不帮我提问前必知必会的一些事关于搜索引擎 提问时 找准对象学会停顿组织你的问题清晰的发问低声下气代替不了做自己的家庭作业删除无意义的要求不要把问题标记为紧急 即使对你而言的确如此礼貌总是有益的对待无礼提问禁区 总结 前言 众所周知&am…

提问的艺术,原文链接

你提的问题没有任何有用的信息&#xff0c;u hava a poop。 提问的艺术 今天在拉屎的时候看到QQ群里有人问问题&#xff0c;那个问题太他妈蠢了&#xff0c;所以我就写了这一片博客&#xff0c;如果再有人问愚蠢的问题我就把这篇博客丢给他。 提问的艺术 原文链接&#xff…

《提问的艺术:如何快速获得答案》(精读版)

《提问的艺术》《How-To-Ask-Questions-The-Smart-Way》 https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way © 2001 Eric Steve Raymond © 2001 D.H.Grand(nOBODY/Ginux) © 2012 Conmajia《提问的艺术&#xff1a;如何快速获得答案》原著Eric…

Serverlet理解

部分转载自&#xff1a;https://blog.csdn.net/javaloveiphone/article/details/8154791 从上图可以看出 Tomcat 的容器分为四个等级&#xff0c;真正管理Servlet 的容器是Context 容器&#xff0c;一个 Context 对应一个 Web 工程。除了将 Servlet 包装成 StandardWrapper 并作…

java serverlet_Serverlet程序

Serverlet是用Java编写的服务器端程序;主要用于交互地浏览和修改数据&#xff0c;生成动态Web内容; 一个serverlet就是一个继承于HttpServlet抽象类的Java类&#xff1b;下面先看一个简单的例子 import javax.servlet.*;importjavax.servlet.http.HttpServlet;importjavax.serv…

serverlet 区别_jsp serverlet 区别

JSP和Servlet的概念对于JSP初学者来说比较不清楚&#xff0c;以下总结一些个人看法&#xff1a; (1).简单的来说Jsp就是含有Java代码的html&#xff0c;而servlet是含有html的Java代码&#xff1b; (2).Jsp最终也是被解释为servlet并编译再执行&#xff0c;Jsp不过是servlet的另…

Java开发之ServLet详解

一、什么是ServLet&#xff1f; serverLet是javaEE中运行于服务器端的&#xff0c;用于接收和响应HTTP协议的请求的程序。 二、ServLet的三种实现方式 1、实现ServLet接口 步骤&#xff1a; &#xff08;1&#xff09;实现ServLet接口 &#xff08;2&#xff09;重写包括s…