鱼C论坛

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

[学习笔记] Kruskal_MST_Algorithm

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

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

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

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

#define MaxVertexNum 100
#define Infiniate 65535
typedef bool VertexType;
typedef int EdgeType;


typedef struct {
        int start;
        int end;
        int weight;
}EdgeArray;


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

int main()
{

        EdgeArray* D;
        int Edgenumber;
        int VertexNumber;
        printf("Please input the Edgenumber and VertexNumber\n");
        scanf("%d%d", &Edgenumber, &VertexNumber);
        D = InitKruskal(Edgenumber);
        printf("The Kruskal result:\n");
        MSTKruskal(D, Edgenumber, VertexNumber);
}


EdgeArray* InitKruskal(int Edgenumber) {
        printf("Please input a edgedarray, according to from small to large\n");
        printf("for example: start end weight\n");
        int start, end, weight;
        EdgeArray *D = (EdgeArray *)malloc(sizeof(EdgeArray) * Edgenumber);
        for (int i = 0; i < Edgenumber; i++) {
                scanf("%d%d%d", &start, &end, &weight);
                (D + i)->start = start;
                (D + i)->end = end;
                (D + i)->weight = weight;
        }
        return D;
}
void MSTKruskal(EdgeArray *D, int Edgenumber, int VertexNumber) {
        int n, m;
        int parent[MaxVertexNum];
        for (int i = 0; i < VertexNumber; i++) {
                *(parent + i) = 0;
        }
        for (int j = 0; j < Edgenumber; j++) {
                n = Find(parent, (D + j)->start);
                m = Find(parent, (D + j)->end);
                if (n != m) {
                        parent[n] = m;
                        printf("%d %d %d\n", (D + j)->start, (D + j)->end, (D + j)->weight);
                }
        }
}
//Find函数最为神奇
int Find(int *parent, int f) {
        while (*(parent + f) > 0) {
                f = *(parent + f);
        }
        return f;
}
/*
 输入: 10 6
0 2 1
3 5 2
1 4 3
2 5 4
2 3 5
1 2 5
0 3 5
0 1 6
2 4 6
4 5 6
输出:
0 2 1
3 5 2
1 4 3
2 5 4
1 2 5
 */

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 07:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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