鱼C论坛

 找回密码
 立即注册
查看: 2870|回复: 0

[学习笔记] Kruskal_MST_Algorithm

[复制链接]
发表于 2019-1-14 20:21:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MaxVertexNum 100
  4. #define Infiniate 65535
  5. typedef bool VertexType;
  6. typedef int EdgeType;


  7. typedef struct {
  8.         int start;
  9.         int end;
  10.         int weight;
  11. }EdgeArray;


  12. EdgeArray* InitKruskal(int Edgenumber);
  13. void MSTKruskal(EdgeArray *D, int Edgenumber, int VertexNumber);
  14. int Find(int *parent, int vertex);

  15. int main()
  16. {

  17.         EdgeArray* D;
  18.         int Edgenumber;
  19.         int VertexNumber;
  20.         printf("Please input the Edgenumber and VertexNumber\n");
  21.         scanf("%d%d", &Edgenumber, &VertexNumber);
  22.         D = InitKruskal(Edgenumber);
  23.         printf("The Kruskal result:\n");
  24.         MSTKruskal(D, Edgenumber, VertexNumber);
  25. }


  26. EdgeArray* InitKruskal(int Edgenumber) {
  27.         printf("Please input a edgedarray, according to from small to large\n");
  28.         printf("for example: start end weight\n");
  29.         int start, end, weight;
  30.         EdgeArray *D = (EdgeArray *)malloc(sizeof(EdgeArray) * Edgenumber);
  31.         for (int i = 0; i < Edgenumber; i++) {
  32.                 scanf("%d%d%d", &start, &end, &weight);
  33.                 (D + i)->start = start;
  34.                 (D + i)->end = end;
  35.                 (D + i)->weight = weight;
  36.         }
  37.         return D;
  38. }
  39. void MSTKruskal(EdgeArray *D, int Edgenumber, int VertexNumber) {
  40.         int n, m;
  41.         int parent[MaxVertexNum];
  42.         for (int i = 0; i < VertexNumber; i++) {
  43.                 *(parent + i) = 0;
  44.         }
  45.         for (int j = 0; j < Edgenumber; j++) {
  46.                 n = Find(parent, (D + j)->start);
  47.                 m = Find(parent, (D + j)->end);
  48.                 if (n != m) {
  49.                         parent[n] = m;
  50.                         printf("%d %d %d\n", (D + j)->start, (D + j)->end, (D + j)->weight);
  51.                 }
  52.         }
  53. }
  54. //Find函数最为神奇
  55. int Find(int *parent, int f) {
  56.         while (*(parent + f) > 0) {
  57.                 f = *(parent + f);
  58.         }
  59.         return f;
  60. }
  61. /*
  62. 输入: 10 6
  63. 0 2 1
  64. 3 5 2
  65. 1 4 3
  66. 2 5 4
  67. 2 3 5
  68. 1 2 5
  69. 0 3 5
  70. 0 1 6
  71. 2 4 6
  72. 4 5 6
  73. 输出:
  74. 0 2 1
  75. 3 5 2
  76. 1 4 3
  77. 2 5 4
  78. 1 2 5
  79. */
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 14:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表