Kruskal算法的基本过程:任给一个有n个顶点的连通网络N={V,E},首先构造一个由这n个顶点组成、不含任何边的图T={V,},其中每个顶点自成一个连通分量。不断从E中取出权值最小的一条边(若有多条,任取其一),若该边的两个端点来自不同的连通分量,则将此边加入到T中。如此重复,直到所有顶点在同一个连通分量上为止。
实现分析:
- 由于需要不断判断两个端点是否来自同一个连通分量,否的话,两个连通分量的顶点并起来,这里可以用并查集实现。
- 由于不断从边集中取出权值最小的一条边,这里可以用最小堆来实现。
下面提供面向邻接矩阵和面向邻接表的Kruskal算法实现:
//
// main.cpp
// Kruskal-最小生成树
//
// Created by scnulpc on 2018/10/25.
// Copyright © 2018年 scnulpc. All rights reserved.
//
#include <iostream>
#include <queue>
#define maxWeight 99
#define size 100
using namespace std;
//邻接矩阵的存储结构
struct Edge {
int v1,v2;
int weight;
Edge(int a,int b,int cost):v1(a),v2(b),weight(cost){}
friend bool operator < (Edge a,Edge b)
{
return a.weight > b.weight; //