1.快速了解Prim算法
学过数据结构的看官老爷们都应该知道,普里姆太熟悉了,不就是最小生成树的算法嘛,是的它是一种求最小树的算法。本文通过剖析伪代码的过程来理解这个“easy algorithm”。
话不多说下面先描述下算法:
运算方法是任取一个点,以这个点为集合开始,然后对所有点与这个点的距离进行更新,找出离这个集合最近的点,然后把这个点放进这个集合(所以每一次运算的时候都要判断一下这个点是否在这个集合里,所有要用到一个vset数组)更新权值,然后再以这个集合继续寻找离这个集合最近的点,直到没有点存在。
2.伪代码讲解Prim算法
第一个for 循环初始化最小权值结集合(表示最小生成树到结点v的权值),V为 所有顶点的集合 .
随机选取一个顶点作为起始顶点并加入集合U(最小生成树的结点).
对所有结点进行while循环,N(U)表示结点集合
第二for循环从剩余结点选取到当前最小生成树的最小路径权值的点。 记录结点u->v的路径权值集合如果小于
则将更新
的值为
,
记录可能选取的结点,
选取新的结点后更新集合U,以及F(存储最小生成树边的集合),
也许不大好理解下面我们来看个例子吧
下表是最小生成树的简化过程,只列举了生成树的有效步骤没有将所有可能情况列出
| u | v | U | V | π(v) | P(v) | F |
|---|---|---|---|---|---|---|
| a | d | {a,d,b} | {a,b,c,d,e,f,g,h} | 5 | d | {a->d} |
| d | b | {a,d} | {a,b,c,d,e,f,g,h} | 8 | b | {a->d,d->b} |
| a | c | {a,d,b,c} | {a,b,c,d,e,f,g,h} | 9 | c | {a->d,d->b,a->c} |
| b | f | {a,d,b,c,f} | {a,b,c,d,e,f,g,h} | 9 | f | {a->d,d->b,a->c,b->f} |
| f | e | {a,d,b,c,f,e} | {a,b,c,d,e,f,g,h} | 6 | e | {a->d,d->b,a->c,b->f,f->e} |
| e |


447

被折叠的 条评论
为什么被折叠?



