最小生成树
@(算法)
概念
生成树:
如果连通网G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。
最小生成树:
在连通网G的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
Kruskal 算法
又称为加边法,将边排序后从小到大依次检查直到所有边都得到联通。这个方法因为只与边有关,所以适合点稠密图。
输入
点集合vextex, 边集合edge
算法步骤
- 将所有边按代价值从小到大排序,并初始化一个空点集A以及一个空边集B。
- 依次遍历所有边,若当前边中存在一个点不属于A,那么则将该边加入B,并将边的两点加入A;若当前边的两点都已加入A中,则跳过该边。
- 按2的做法,直到A=vextex结束。
Prim 算法
又称为加点法,任取一点后,通过这个点逐渐长出整个生成树,因为操作都和点相关,所以适合边稠密图。
输入
点集合vextex, 边集合edge
算法步骤
- 从vextex中任取一点u,并设置两个点集合, U=u,V=vextex−u U = u , V = v e x t e x − u ,U表示已经成为最小生成树一部分的点集。
- 设置一个visited数组,用于表示哪些点已经加入到U当中(在python里我是用字典实现的,所以不需要这个数组),同时再设置一个cost数组,用于表示当前点连接到U上的代价。
- 通过U里面的点,先更新所有V里的点直接连接U里的点的代价,并记录到cost数组&#