[应用方案] C语言程序克鲁斯卡尔算法

[复制链接]
 楼主| albertaabbot 发表于 2024-2-18 20:19 | 显示全部楼层 |阅读模式
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>

  3. typedef struct Edge
  4. {
  5.         int v1, v2;
  6.         int wight;
  7. }Edge;

  8. int main()
  9. {
  10.         int n, m;//结点数和边数
  11.         int i, j, k = 0;
  12.         int count = 0;
  13.         Edge edge[100];//边集
  14.         int vest[30];//判断是否成环的编号数组
  15.         scanf("%d %d", &n, &m);
  16.         for (i = 0; i < m; i++)
  17.         {
  18.                 scanf("%d %d %d", &edge[i].v1, &edge[i].v2, &edge[i].wight);
  19.                 if(edge[i].v1 > edge[i].v2)
  20.                 {
  21.                         int t = edge[i].v1;
  22.                         edge[i].v1 = edge[i].v2;
  23.                         edge[i].v2 = t;
  24.                 }
  25.         }
  26.         for (i = 1; i <= n; i++)//初始化编号数组
  27.                 vest[i] = i;
  28.         for (i = 0; i < m - 1; i++)//排序
  29.         {
  30.                 for (j = 0; j < m - i - 1; j++)
  31.                 {
  32.                         if (edge[j].wight > edge[j + 1].wight)
  33.                         {
  34.                                 Edge t = edge[j];
  35.                                 edge[j] = edge[j + 1];
  36.                                 edge[j + 1] = t;
  37.                         }
  38.                 }
  39.         }
  40.         for (i = 0; i < m && count < n - 1; i++)
  41.         {
  42.                 if (vest[edge[i].v1] != vest[edge[i].v2])//说明不构成环,打印
  43.                 {
  44.                         printf("%d %d %d\n", edge[i].v1, edge[i].v2, edge[i].wight);
  45.                         count++;
  46.                         int flag1 = vest[edge[i].v1];
  47.                         int flag2 = vest[edge[i].v2];
  48.                         for (j = 1; j <= n; j++)
  49.                         {
  50.                                 if (vest[j] == flag2)//把全部编号为flag2的结点改为flag1
  51.                                         vest[j] = flag1;
  52.                         }
  53.                 }
  54.         }
  55.         return 0;
  56. }


tpgf 发表于 2024-3-5 14:51 | 显示全部楼层
克鲁斯卡尔算法相对于普里姆算法而言,适合于求边稀疏的网的最小生成树。
xiaoqizi 发表于 2024-3-5 15:26 | 显示全部楼层
这个算法的主要用途是什么 什么产品需要使用它呢
木木guainv 发表于 2024-3-5 16:17 | 显示全部楼层
算法其实不复杂,首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止
wakayi 发表于 2024-3-5 17:23 | 显示全部楼层
时间复杂度为为O(e^2), 使用并查集优化后复杂度为 O(eloge),与网中的边数有关,适用于求边稀疏的网的最小生成树
renzheshengui 发表于 2024-3-5 17:56 | 显示全部楼层
克鲁斯卡尔算法是一种用来寻找最小生成树的算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

1528

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

13

主题

1528

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部