最小生成树Prim算法
在保证图连通的情况下,去掉边数最多所得到的树叫做最小生成树。也就是说一个图,去掉一些边后,图仍是连接的,而这时图剩下的边数最少就是最小生成树,这时候图一定是树状结构的。可以用反证法:如果不是树状的,也就是说还有闭环,那么一定可以再去掉一些边使图中的所有闭环被破坏,最终图一定就是树状结构了,但如果已经成为了树状结构,再去掉一条边,那么一定会有至少一个节点不能连通了。所以图在连通的情况下去掉最多边剩下的结构一定是树状结构的。图的最小生成树不唯一。
如果边上有权值,那么图就进化成了网。网可以作为很多现实世界中的场景的数学模型。网的最小生成树是连线上的权值之和最小的生成树,这和树中的WPL是不同的。网的最小生成树也不唯一。网的最小生成树可以描述最小耗费,比如说网线构建过程中,要保证每个网络节点都可以连通,建网成本最小的方案就是最小生成树。或者在道路建设中,要保证各种城市都能够连接,最小生成树就是建路成本最少的方案。因此,最小生成树在图和网求耗费最小的最优解场景中具有很好的应用。
最小生成树算法主要有普里姆(Prim)算法和克努斯卡尔(Kruskal)算法。
Prim算法是一种从无到有的生成策略。先把所有的边都去掉,只剩下所有的节点。然后每次添加一条边。Prim算法利用了最小生成树的节点具有最优子结构的性质。这种最优子结构是在添加边时当前选择权值最小的边那么一定可以导致最后总权值最小。因此,Prim算法的具体步骤如下:
设Net=(V,{E}),V是网的节点集,E是边集,TE是最小生成树边的集合。