最小生成树之克鲁斯卡尔算法(Kruskal)

克鲁斯卡尔算法通过选择权值最小的边构建最小生成树,避免形成回路。在添加边时,利用深度优先搜索或并查集判断是否构成环。本文介绍了如何用并查集来实现这一过程。
摘要由CSDN通过智能技术生成

prim算法中的最小生成树是,采用的是从一个顶点开始,让一棵小树逐渐长成最小生成树,而kruskal算法,采用的是每次选择权值最小的一条边作为生成树,采用将每一棵生成树合并一棵最小生成树方法。也就是将树合成为森林。有一点需要注意:就是将新边加入到最小生成树中时,要判断是否构成回路,如果构成回路的话,则不能加入。那么问题来了,如何判断构成回路呢?一种是采用深度优先搜索来判断两个顶点是否连通,另一种是采用并查集来判断是否连通,将所有的顶点加入到一个并查集中,判断两个顶点是否连通,只需要判断两个顶点是否在同一个集合中(即是否有共同的祖先)。

代码如下:

/************************************************************************
*
* 文件名:8.1.2.cpp
*
* 文件描述:最小生成树之克鲁斯卡尔算法(Kruskal)
*
* 创建人:  fdk

* 时  间:  2018-09-13
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include&l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值