DS-7.1实现求最小生成树的克鲁斯卡尔算法(并查集实现)

本文介绍了如何使用克鲁斯卡尔算法结合并查集解决求解有权无向图的最小生成树问题。通过解析输入数据,利用排序和并查集判断边是否构成环,避免形成环路的同时选取最小权重的边。文章提供了解题思路和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:首先吐槽一下学校的OJ,题目上说是输入字母结果后台测试样例却出现数字= =!害得我改来改去提交了7次都是错的。(呸

回到正题

题目描述
已知有权无向图G,利用克鲁斯卡尔算法求出该图的最小生成树。
输入
第一行输入两个正整数n和m(空格间隔), 分别表示图G的顶点总数和边的总数。
第二行连续输入n个字母,分别表示n个顶点的信息。
第三行连续输入m条边的信息,每条边的输入格式为(v1,v2,w),表示一条关联顶点v1和v2的边,其权值为w。
输出
按边上权值由小到大的顺序依次输出各个边。
输出边的时,若该边被选中,则在该边信息之后输出1,否则输出0。
例如:
(v1,v2,w,1) 表示与顶点v1和v2相关联的边,权值为w,被选中。
(v1,v2,w,0) 表示与顶点v1和v2相关联的边,权值为w,未被选中。

解题思路

看到这道题,就是想到用邻接矩阵来存储,然后将题目信息依次输入。克鲁斯卡尔算法是将权重排序,然后从最小的开始取,如果不构成环就将边加入,如果构成环就舍弃,也就是题目中说的1和0。最主要的问题就是我们要不停的检查是否构成环,其实这里应该可以用DFS来判断连通分量(不会所以放弃了)。所以就采用了前几天在博客上看到的并查集。
并查集由一个整数型的数组和两个函数构成。数组pre[]记录了每个点的前导点是什么,函数find是查找,join是合并(这道题没有用到)。

int Find(int *parent, int f) {
    while (parent[f] > 0) {
        f = parent[f];
    }
    return f;
}

我们很容易通过并查集来判断这些点是否都在一个集合里,如果在的话就将边舍弃,如果不在的话就放入。
刚学并查集,理解还不是很深刻,日后再补啦!
下面贴上本题代码

#include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值