Kruskal的最小生成树算法-贪婪算法在C++中

生成树是连接所有顶点的有向无向图子图。图中可以存在许多生成树。每个图上的最小生成树(mst)的权重相同或小于所有其他生成树。权重被分配给生成树的边,总和是分配给每个边的权重。由于 v 是图中的顶点数,因此最小生成树的边数为 (v – 1),其中 v 是边数。

使用 Kruskal 算法查找最小生成树

所有边应按权重非降序排列。

选择最小的边。如果未形成环,则包含该边。

应执行步骤 2,直到生成树具有 (V-1) 条边。

在这种情况下,我们被告知要使用贪婪方法。贪心选项是选择权重最小的边。举例来说:该图的最小生成树为 (9-1)= 8 条边。

立即学习“C++免费学习笔记(深入)”;

Kruskal的最小生成树算法-贪婪算法在C++中

After sorting:Weight  Src    Dest21       27    2622       28    2222       26    2524       20    2124       22    2526       28    2627       22    2327       27    2828       20    2728       21    2229       23    2430       25    2431       21    2734       23    25

现在我们需要根据排序选取所有边。

包含边 26-27->,因为没有形成环

边包括 28-22->,因为没有形成环路

包括边缘 26-25->,因为没有形成环路。

包括边缘 20-21->,因为没有形成环路

边 22-25-> 被包含,因为没有形成环路。

边 28-26-> 因环路形成而被丢弃

边 22-23-> > 包括,因为没有形成环路

边 27-28-> 因环路形成而被丢弃

边线 20-27-> 包括,因为没有形成环路

边21-22->因形成环而被丢弃

边23-24->因未形成环而被包括

由于边的数量为(V-1),所以算法到此结束。

示例

#include #include #include struct Edge {   int src, dest, weight;};struct Graph {   int V, E;   struct Edge* edge;};struct Graph* createGraph(int V, int E){   struct Graph* graph = (struct Graph*)(malloc(sizeof(struct Graph)));   graph->V = V;   graph->E = E;   graph->edge = (struct Edge*)malloc(sizeof( struct Edge)*E);   return graph;}struct subset {   int parent;   int rank;};int find(struct subset subsets[], int i){   if (subsets[i].parent != i)      subsets[i].parent   = find(subsets, subsets[i].parent);   return subsets[i].parent;}void Union(struct subset subsets[], int x, int y){   int xroot = find(subsets, x);   int yroot = find(subsets, y);   if (subsets[xroot].rank  subsets[yroot].rank)      subsets[yroot].parent = xroot;   else{      subsets[yroot].parent = xroot;      subsets[xroot].rank++;   }}int myComp(const void* a, const void* b){   struct Edge* a1 = (struct Edge*)a;   struct Edge* b1 = (struct Edge*)b;   return a1->weight > b1->weight;}void KruskalMST(struct Graph* graph){   int V = graph->V;   struct Edge   result[V];   int e = 0;   int i = 0;   qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);   struct subset* subsets   = (struct subset*)malloc(V * sizeof(struct subset));   for (int v = 0; v < V; ++v) {      subsets[v].parent = v;      subsets[v].rank = 0;   }   while (e < V - 1 && i E) {      struct Edge next_edge = graph->edge[i++];      int x = find(subsets, next_edge.src);      int y = find(subsets, next_edge.dest);      if (x != y) {         result[e++] = next_edge;         Union(subsets, x, y);      }   }   printf("Following are the edges in the constructed MSTn");   int minimumCost = 0;   for (i = 0; i edge[0].src = 20;   graph->edge[0].dest = 21;   graph->edge[0].weight = 30;   graph->edge[1].src = 20;   graph->edge[1].dest = 22;   graph->edge[1].weight = 26;   graph->edge[2].src = 20;   graph->edge[2].dest = 23;   graph->edge[2].weight = 25;   graph->edge[3].src = 21;   graph->edge[3].dest = 23;   graph->edge[3].weight = 35;   graph->edge[4].src = 22;   graph->edge[4].dest = 23;   graph->edge[4].weight = 24;   KruskalMST(graph);   return 0;}

输出

Following are the edges in the constructed MST22 -- 23 == 2420 -- 23 == 2520 -- 21 == 30Minimum Cost Spanning tree : 79

结论

本教程演示了如何使用 Kruskal 的最小生成树算法-贪心法和 C++ 代码来解决此问题。我们还可以用java、python和其他语言编写这段代码。它是根据克鲁斯卡尔的概念建模的。该程序查找给定图中的最短生成树。我们希望本教程对您有所帮助。

以上就是Kruskal的最小生成树算法-贪婪算法在C++中的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1443945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 20:47:35
下一篇 2025年12月10日 01:03:55

相关推荐

  • 如何使用C语言中的for循环打印用户选择的一个月份的日历?

    The logic to print a one-month calendar is as follows − for(i=1;i<first;i++) printf(" ");for(i=1;i<=noofdays;i++){ printf("%3d&qu…

    2025年12月17日
    000
  • 在C语言中,bool的使用

    在 C 语言中,没有预定义的 bool 数据类型。我们可以使用枚举创建布尔值。一个枚举将被创建为 bool,然后将 false 和 true 作为枚举的元素。 false 将位于第一个位置,因此它将保留 0,true 将位于第二个位置,因此它将获得值 1。现在我们可以使用它作为数据类型。 示例 #i…

    2025年12月17日
    000
  • 一个用C语言编写的程序,用于检查二叉树是否为二叉搜索树(BST)

    二叉树是一种树形数据结构,每个节点都有两个子节点。这两个子节点被称为左子节点和右子节点。 二叉搜索树(BST)是一种树形结构,其中左子树包含小于根节点的值的节点,右子树包含大于根节点的值的节点。 在这里,我们将检查一个二叉树是否是BST: 为了检查这个,我们需要在二叉树上检查BST条件。对于根节点,…

    2025年12月17日
    000
  • 在C语言中,字符串搜索函数是什么?

    该库还提供了几个字符串搜索函数,如下 – char *strchr (const char *string, intc); 查找字符串中第一次出现的字符 c。 char “strrchr (const char “string, intc); 查找字符串中最后一次…

    2025年12月17日
    000
  • 在C和C++中的未定义行为

    在这里,我们将看到一些C和C++代码,并尝试猜测结果。这些代码将生成一些运行时错误。 1. 除以零的错误是未定义的。 示例代码 #include using namespace std;int main() { int x = 10, y = 0; int z = x / y; cout <&…

    2025年12月17日
    000
  • 使用C语言在数组中插入元素

    我们可以在任意位置插入元素,这意味着我们可以在数组的起始位置、中间、最后或任意位置插入。 在数组中插入元素后,位置或索引位置增加,但并不意味着数组的大小增加。 插入元素的逻辑是− 输入数组的大小 立即学习“C语言免费学习笔记(深入)”; 输入要插入元素的位置 接下来输入您要在该位置插入的数字 for…

    2025年12月17日
    000
  • 在C语言中,Realloc是什么意思?

    c库的内存分配函数void *realloc(void *ptr, size_t size) 尝试重新调整由ptr指向的先前使用malloc或calloc调用分配的内存块。 内存分配函数 内存可以通过以下两种方式进行分配: 一旦在编译时分配了内存,就无法在执行期间更改。要么内存不足,要么内存浪费。 …

    2025年12月17日
    000
  • 使用C++找到模方程的解的数量

    在本文中,我们将解释什么是模方程的​​解,我们还将编写一个程序来查找模方程的多个解。这是基本示例 – Input : X = 30 Y = 2Output : 4, 7, 14, 28Explanation : 30 mod 4 = 2 (equals Y), 30 mod 7 = 2 …

    2025年12月17日
    000
  • 在C语言中,什么是数组的越界索引?

    假设您有一个包含四个元素的数组。那么,数组索引将从0到3,即我们可以访问索引0到3的元素。 但是,如果我们使用大于3的索引,它将被称为索引越界。 如果我们使用越界的数组索引,那么编译器将编译甚至运行。但是,不能保证结果正确。 结果可能不确定,并且会导致许多问题。因此,建议在使用数组索引时要小心。 立…

    2025年12月17日
    000
  • 在C语言中,将多个字符分配给一个int变量

    字符类型数据在C或C++内部通过其ASCII值存储。如果我们想将单个字符打印为整数,我们将获得 ASCII 值。但是,当我们尝试使用单引号打印多个字符时,它会打印一些奇怪的输出。 请检查以下程序以了解这一想法。 示例 #include int main() { printf(“%d”, ‘A’); …

    2025年12月17日
    000
  • C++程序,从两侧删除最小的元素,使得2*最小值大于最大值

    该问题涉及以 2*min 大于 max 的方式从整数列表的任意一侧删除元素。 vector arr = {250, 10, 11, 12, 19, 200};res = solve(arr); 我们可以使用暴力方法。我们可以尝试所有可能的满足并找到满足 2*min > max 条件的最长子数组…

    2025年12月17日
    000
  • 如何在C语言中将整个数组作为参数发送?

    数组是一组使用通用名称存储的相关项。 声明数组 声明数组的语法如下 – datatype array_name [size]; 初始化 数组可以通过两种方式初始化,如下 – 编译时初始化。运行时初始化。 数组也可以在声明时初始化,如下所示 – 立即学习“C语言免费…

    2025年12月17日
    000
  • 在C语言中,如果在函数声明之前调用函数会发生什么?

    如果我们不使用一些函数原型,并且函数体在调用该函数的语句之后的某个部分声明。在这种情况下,编译器认为默认的返回类型是整数。但是如果函数返回其他类型的值,就会返回一个错误。如果返回类型也是整数,则可以正常工作,有时可能会生成一些警告。 示例代码 #includemain() { printf(“The…

    2025年12月17日
    000
  • 在C语言中,mbtowc函数的翻译是什么?

    C库函数 int mbtowc(whcar_t *pwc, const char *str, size_t n)将一个多字节序列转换为宽字符。 以下是mbtowc()函数的声明。 int mbtowc(whcar_t *pwc, const char *str, size_t n) 参数如下: pw…

    2025年12月17日
    000
  • C语言中的数组

    数组是连续内存位置上相同类型元素的集合。最低地址对应于第一个元素,最高地址对应于最后一个元素。 数组索引以零 (0) 开始,以数组大小减一(数组大小 – 1)结束。数组大小必须是大于零的整数。 让我们看一个例子, If array size = 10First index of arra…

    2025年12月17日
    000
  • 使用C语言的除法和取模运算符将数字按照相反的顺序打印出来

    Problem How to print the given two-digit number in reverse order with the help of division and Modulo operator using C programming language? Solution …

    2025年12月17日
    000
  • 在C编程中,将数组中的数字求平均值

    数组中存储了 n 个元素,该程序计算这些数字的平均值。使用不同的方法。 输入– 1 2 3 4 5 6 7 输出– 4 说明 – 数组 1+2+3+4+5+6+7=28 的元素总和 数组中的元素数量=7 Average=28/7=4 有两种方法 方法1 -迭代 在…

    2025年12月17日
    000
  • 如何使用C++在OpenCV中使用感兴趣区域(ROI)?

    要从图像中分离出特定部分,我们必须首先找到该区域。然后我们必须将该区域从主图像复制到另一个矩阵。这就是ROI的工作原理OpenCV工作。 在这个例子中,开始时声明了两个矩阵。之后,一个名为‘image_name.jpg’的图像被加载到‘image1’矩…

    2025年12月17日
    000
  • 用C语言编写计算十边形周长的程序

    什么是十边形? 给定边长,任务是计算十边形的周长。十边形是一种有10条边的多边形,因此也被称为10边形。它有10个顶点和边。一个正十边形的边长相等,每个内角为144度。 下面是十边形的图形 计算圆锥台的体积和表面积有一个公式 Perimeter = 10 * Side 示例 Input-: side…

    2025年12月17日
    000
  • 在C语言中编写一个程序,打印出以Z形状排列的平方矩阵

    程序描述 以z形式打印平方矩阵的元素 一个方阵是行数和列数相同的矩阵。一个n×n的矩阵被称为n阶方阵  算法 To print the elements of the Square Matrix in Z formWe need to print the first row of matrix th…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信