打印
[应用方案]

C语言程序克鲁斯卡尔算法

[复制链接]
880|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
albertaabbot|  楼主 | 2024-2-18 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

typedef struct Edge
{
        int v1, v2;
        int wight;
}Edge;

int main()
{
        int n, m;//结点数和边数
        int i, j, k = 0;
        int count = 0;
        Edge edge[100];//边集
        int vest[30];//判断是否成环的编号数组
        scanf("%d %d", &n, &m);
        for (i = 0; i < m; i++)
        {
                scanf("%d %d %d", &edge[i].v1, &edge[i].v2, &edge[i].wight);
                if(edge[i].v1 > edge[i].v2)
                {
                        int t = edge[i].v1;
                        edge[i].v1 = edge[i].v2;
                        edge[i].v2 = t;
                }
        }
        for (i = 1; i <= n; i++)//初始化编号数组
                vest[i] = i;
        for (i = 0; i < m - 1; i++)//排序
        {
                for (j = 0; j < m - i - 1; j++)
                {
                        if (edge[j].wight > edge[j + 1].wight)
                        {
                                Edge t = edge[j];
                                edge[j] = edge[j + 1];
                                edge[j + 1] = t;
                        }
                }
        }
        for (i = 0; i < m && count < n - 1; i++)
        {
                if (vest[edge[i].v1] != vest[edge[i].v2])//说明不构成环,打印
                {
                        printf("%d %d %d\n", edge[i].v1, edge[i].v2, edge[i].wight);
                        count++;
                        int flag1 = vest[edge[i].v1];
                        int flag2 = vest[edge[i].v2];
                        for (j = 1; j <= n; j++)
                        {
                                if (vest[j] == flag2)//把全部编号为flag2的结点改为flag1
                                        vest[j] = flag1;
                        }
                }
        }
        return 0;
}


使用特权

评论回复
沙发
tpgf| | 2024-3-5 14:51 | 只看该作者
克鲁斯卡尔算法相对于普里姆算法而言,适合于求边稀疏的网的最小生成树。

使用特权

评论回复
板凳
xiaoqizi| | 2024-3-5 15:26 | 只看该作者
这个算法的主要用途是什么 什么产品需要使用它呢

使用特权

评论回复
地板
木木guainv| | 2024-3-5 16:17 | 只看该作者
算法其实不复杂,首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止

使用特权

评论回复
5
wakayi| | 2024-3-5 17:23 | 只看该作者
时间复杂度为为O(e^2), 使用并查集优化后复杂度为 O(eloge),与网中的边数有关,适用于求边稀疏的网的最小生成树

使用特权

评论回复
6
renzheshengui| | 2024-3-5 17:56 | 只看该作者
克鲁斯卡尔算法是一种用来寻找最小生成树的算法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

1300

帖子

1

粉丝