Kruskal算法并查集和最小堆实现

本文介绍了使用Kruskal算法构造最小生成树,通过并查集和邻接表来实现,避免了最小堆的操作,首先对边进行排序,然后依次添加最小权值的边,直到构建出包含n-1条边的树。
摘要由CSDN通过智能技术生成

Kruskal算法的基本思想是,将图中的节点分类,分成两个集合,分别表示成S和T其中S是不在生成树中的节点集合,T是在生成树中的节点集合。刚开始的时候,T中只有源节点一个节点。同时将图中的所有边按照权值排序。然后每次向图中添加一条权值最小的边,同时满足,这条边的一个节点在S中一个节点在T中。这样循环,直到树中有了n-1条边为止。实现的代码如下:

 

 

 

/**

这边使用并查集实现Kruskal算法,并没有使用最小堆,代替的使用了一个排序的方法对边进行排序,然后从小到大的进行取出就行了。

图的表示方法是邻接表表示,不再使用邻接矩阵表示。

**/

#include<iostream>

#include <algorithm>

#include <vector>

using namespace std;

#define MAXNODES  10000    //定义了最大的节点数

 

//边类

class   Edge

{

public:

    double cost;    //边的权值

int head,tail ;             //这条边的另一个节点

Edge * next ;  //指向这个节点的下一条边。

Edge (int head,int tail ,double cost ):head(head),tail(tail),cost(cost){}

    bool operator <(Edge  & e)

{

return this->cost < e.cost;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值