最小生成树
树的性质:
1. 用一条边连接任意两个新的顶点都会产生一个新的环
2. 从树中删掉一条边会得到两棵新的树
切分定理:
由上述两条性质可以得到切分定理:
(切分是将图中的顶点分为两个不同的集合,然后比较其横切边的权值)
(横切边是一条连接两个顶点的不同的边)
在一幅加权图中,给定任意的切分,它的横切边中最小者一定属于最小生成树。
(证明:利用反证法,假设最小生成树不包含其中一条最小的横切边E,那么将E加入到最小生成树中,根据树的性质,将会形成一个环。这个环中一定包含另外的一条横切边F,且F的权重一定大于E。若原图删掉F,则得到两棵树,以E连接后最小生成树的权重更小。)
贪心算法:
使用切分定理找到最小生成树的一条边,更换切分方式,找到另外的一条边,重复此过程,直到找到所有属于最小生成树的边(N-1)。
Prim 延时算法:
逐步添加,每一步为生长中的树添加一条边。当添加一条边时(优先队列中权重最小的边),同时也包含了一个节点,此节点与这时不在生成树中的相邻节点的连线需添加到优先队列中去,此节点与这时在生成树中的节点相连的边变为失效的边,应在优先队列中删除。重复此过程,直到找到所有的边(N-1)。
Prim 即时算法:
与延时算法大体相同,但不同的是对优先队列的操作。优先队列保证非生成树的节点与已经生成的树节点之间的边是权重最小的。即延时算法中本应加入到优先队列中的权重大的边可能在即时算法中被忽略而不对优先队列产生影响。
Kruskal 算法:
Prim算法是一条边一条边地构造,kruskal算法也是。不同的是,kruskal算法构造最小生成树的时候有可能会产生森林,最后会生成最小生成树。
按权重排序所有的边,选权重最小的边加入到最小生成树中,同时删除新加入的节点与生成树节点相连的边。重复直到找到所有的边。