[Data Structure & Algorithm] 无向图的最小生成树
最小生成树(Minimum Spanning Tree) - 连接所有顶点的边的权值之和最小的树
Prim算法
- 基本思路 - 设 图的顶点集合为V;其最小生成树的顶点集合为U
- 将某个顶点放入U
- 在一个顶点属于U,另一个顶点属于V-U的所有的边中,找到权值最小的边
- 将找到的边的不属于U的顶点,放入U中,重复2,直至U中包含了所有顶点
- 具体实现
- 引入辅助数组edge[],长度等于顶点数
- 结点结构 - 数据域vertex(与该顶点相连的另一顶点)|权值cost(这条边的权值)
- 对于在U中的结点 i - edge[i].cost = 0
- 对于在V-U中的结点 j -edge[j]代表与结点j相连的权值最小的边
- 时间复杂度 O(n2) (与边的数量无关)
- 引入辅助数组edge[],长度等于顶点数
- 适用于边稠密的图
Kruskal算法
- 基本思路
- 在图中选择权值最小的边
- 如果这条边不会形成环路,则选择这条边;否则,查找下一权值的边
- 时间复杂度(与顶点数量无关)
- O(n2) - 已经按照边的权值排序
- O(elog2e) - 未按照边的权值排序
- 适用于边系数的图