数据结构算法题/图的生成树:Prim算法和Kruskal

1. 生成树

在一个任意连通图G中,如果取它的全部顶点和一部分边构成一个子图G',即:V(G')=V(G)和E(G')⊆E(G)

若同时满足边集E(G')中的所有边既能够使全部顶点连通而又不形成任何回路,则称子图G'是原图G的一棵生成树

连通图是n个点n-1条边。 在图G的一棵生成树G'中,若再增加一条边,就会出现一条回路。这是因为此边的两个端点已连通,再加入此边后,这两个端点间有两条路径,因此就形成了一条回路,子图G'也就不再是生成树了。同样,若从生成树G'中删去一条边,就使得G'变为非连通图。这是因为此边的两个端点是靠此边唯一连通的,删除此边后,必定使这两个端点分属于两个连通分量中,使G'变成了具有两个两通分量的非连通图。

所以生成树满足以下条件:
(1)V(G')=V(G)和E(G')⊆E(G)

(2)G'联通的

(3)G'没有回路

生成树的性质:

(1)G'中有n-1条边

(2)生成树不唯一

2. 最小生成树Minimum Spanning Tree(MST)

最小生成树是一副连通加权无向图中一棵权值最小的生成树

3 实现方法

求图的最小生成树的方法(算法)主要有两个:

(1)普里姆算法:断集法,子树生长法

(2)克鲁斯卡尔算法:避圈法,短边优先法

主要可以使用Prim和Kruskal算法实现,对于稀疏图来说,用Kruskal效率更高加上并查集可对其进行优化。

4 Kruskal

基本思路是:

先构造一个只有n个节点的子图T。

然后从权值最小的边Ei依次选取,如果添加Ei到T中不产生回路则在T中添加这条边。

如此重复直到添加到n-1条边为止。

5 Prim算法

猜你喜欢

转载自blog.csdn.net/fkyyly/article/details/83315599