算法描述:
一个图的生成树是一个树并把图的所有顶点连接在一起。一个图可以有许多不同的生成树。最小生成树其实是最小权重生成树的简称。
最小生成树有(V – 1)条边,其中V是给定的图的顶点数量。
Kruskal算法是一种贪心算法。贪心的选择是选择最小的权重的边,并不会和当前的生成树形成环。
算法步骤:
1,按照所有边的权重排序(从小到大)
2,选择最小的边。检查它是否形成与当前生成树形成环。如果没有形成环,将这条边
加入生成树。否则,丢弃它。
3,重复第2步,直到有生成树(V-1)条边
求下图的最小生成树(MST:minimum spanning tree)
该图有9个节点,14条边,MST有8条边。
将每条边按权重排序如下(从小到大):
Weight Src Dest
1 7 6
2 8 2
2 6 5
4 0 1
4 2 5
6 8 6
7 2 3
7 7 8
8 0 7
8 1 2
9 3 4
10 5 4
11 1 7
14 3 5
依次选择边:
已经选择V-1条边,算法结束。
时间复杂度:
O(ElogE) 或 O(ElogV)。 排序使用 O(ELogE) 的时间,之后我们遍历中使用并查集O(LogV) ,所以总共复杂度是 O(ELogE + ELogV)。E的值最多为V^2,所以
O(LogV) 和 O(LogE) 可以看做是一样的。
算法实现:
//Kruskal算法求无向带权图的最小生成树
#include <iostream>
#include<stdlib.h>
using namespace std;
//带权边的结构体
struct Edge
{
int start;
int end;
int weight;
};
//无向图
struct Graph
{
// V-> 顶点个数 E-> 边的个数
i