赞
踩
很长一段时间内,zhn_666每周会更一些之前的学过的算法,也会把曾经因为懒惰之类的原因没学的算法重新学一遍,这次会好好写博客,希望有缘人看到也能学到点东西
这周俺要复习的算法是有关最小生成树的
首先介绍一些关于图的定义
- 连通图:在一张无向图中,任意两点都联通,则称此无向图为连通图
- 强连通图:在一张有向图中,任意两点都联通,则称此有向图为强连通图
- 生成树:在有n个点连通图中,选n-1条边构成的连通子图,则为一棵生成树。
- 最小生成树:在生成树中,使得这n-1条边权值和最小,为最小生成树。
解决最小生成树类的问题有主要两种方法,第一种为Kruskal算法,第二种为prim算法
Kruskal 算法
此算法可以称为“加边法”,初始最小生成树边数为0,每次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。
(1) 把图中的所有边按代价从小到大排序,把每个点看成一棵树;
(2) 按权值从小到大选择边,所选的边连接的两个顶点u,v,u,v,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。(前置技能:并查集)
(3)重复(2),直到构成了一棵n-1条边的树。
prim 算法
此算法可以称为“加点法”,我们随便选择一个不在图中的点,选择它与这张图能相连的最小权值的边,直到构成一棵树。
(1) 在一个加权连通图中,顶点集合V,边集合为E
(2) 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit.
(3) 重复以下操作,直到所有点都被标记为visit:
题单(先写一发水的,代码日后会更新 咕咕咕警告 )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。