图论(十)最小生成树-Prim算法

来源:互联网 发布:考研英语二参考书知乎 编辑:程序博客网 时间:2024/05/20 19:49

前面说过Prim算法是从顶点着手构建最小生成树的。应该说Prim算法比Kruskal简单我们还是以前面的乡镇假设光纤网络为例:


Prim算法工作步骤

(1) 构建全部顶点集V,选取初始顶点加入顶点集U

构建顶点集V={a,b,c,d,e,f,g,h,i},从中选取任意一个顶点。我们假设从顶点a开始。将a加入到顶点集U={a}中

(2) U点与V-U中顶点的所有边。

 

U中顶点只有aV-U={b,c,d,e,f,g,h,i}U顶点与V-U顶点的所有边为a-b和a-f,图中紫色边。U顶点绿色背景顶点V-U顶点黑色背景顶点

(3) 选取所有边中的最短边加入最小生成树。


所有a-b和a-f中的最短边a-b,将其加入最小生成树(图中绿色边)

(4) 最短边另一头的顶点加入顶点集合U

最短边a-b的另一头顶点为b,将b加入到U={a,b}。


(5) 继续找U点与V-U中顶点的所有边。

此时,U={a,b}V-U={c,d,e,f,g,h,i},UV-U顶点所有边为a-f, b-c, b-g,b-h。图中紫色边所示。


(6) 继续选取最短边将最短边加入最小生成树最短边另一头顶点加入U

此时最短边为a-f将最短边加入最小生成树,并将最短顶点f加入U={a,b,f}此时V-U={c,d,e,g,h,i}。

 

(7) 如此循环反复,直至U=V

下面顺序的UV-U以及最小生成树的变化过程:

 

                              U={a,b,f,g};V-U={c,d,e,h,i}                                                   U={a,b,f,g,h};V-U={c,d,e,i}

 

 

                              U={a,b,c,f,g,h};V-U={d,e,i}                                                    U={a,b,c,f,g,h,i};V-U={d,e}

 

  

                             U={a,b,c,e,f,g,h,i};V-U={d}                                                      U={a,b,c,d,e,f,g,h,i};V-U={}

 

为什么不会构成环

因为我们在寻找边时,是找UV-U顶点构成边,而U中内部顶点的边是不找的。找到最短边后,直接另一头顶点加入U就是说这两个顶点都在U了,即使2顶点还有其他路径,后面都不会再找,也就不会构成回路了。

原创粉丝点击