最小生成树
最小生成树的产生:希望在城市间建设基础设施,连通所有城市,不考虑容错性,如果花费最低成本实现?
最小生成子树:原图选出这样的边,让所有顶点连通,边权重和最低。(生成子图不需要后两个条件)
Kruskal算法
Kruskal算法的产生:从定义出发,选择边,让其涵盖所有顶点。边的选择使用贪心思想,限制是辐射生长的树。假设图包含 个顶点。
- 第 边,先选择最小权重的一条边,记录下已连通的 个顶点。
- 第 边,然后选择下一条最小权重的边,该边不能连接已连通的顶点(否则形成环,多余的边被加入,如下图1.1所示)。记录下已连通的 个顶点
- 第 边,继续选择下一条最小权重的边,该边不能连接已连通的顶点,此时已连通全部 个顶点,结束。
动态效果图:
Prim算法
Prim算法的产生:类似路由选择下一跳的过程。下一跳选择使用贪心思想,类似Kruskal的辐射。
- 先随机选中一个顶点,选择下一跳顶点,跳跃边权重最小。
- 此时图已包含了两个顶点,观察两个顶点的所有下一跳顶点,继续选择该下一跳权重最小的顶点,且该顶点还没连通上。
- 此时图已包含了三个顶点,观察三个顶点的所有下一跳顶点,继续选择该下一跳权重最小的顶点,且该顶点还没连通上。
- 。。。
- 此时图已包含了 个顶点,观察 个顶点的所有下一跳顶点,继续选择该下一跳权重最小的顶点,且该顶点还没连通上,也就是最后一个顶点。
- 此时图已包含了 个顶点,结束。
数据结构:集合动态记录已连通的节点。邻接信息(表/矩阵)。
动态效果图: