浅入浅出数据结构(25)——最小生成树问题 (2)

  2.找出所有已知顶点邻接的未知顶点,其中与任一已知顶点的邻接边权重最小的未知顶点,我们将其标为已知,同时将其preV设为与其邻接边最小的已知顶点,且其distance设为该邻接边的权重(在Dijkstra算法中,我们用的是“指向”,因为要考虑到有向图的情况,此外,Dijkstra算法中,我们将被标为已知的未知顶点的distance设为与其相连的已知顶点的distance加上边的权重)

  3.反复执行第二步,直至不存在已知顶点邻接了未知顶点为止。

  抽象的说,Prim算法就是随机选一个顶点,将其拉进原先为空的树中,然后不断地通过尽可能小的边将其他顶点拉进这棵树中

  

  老样子,上述说法晦涩难懂 ( ̄. ̄)。所以我们需要实际的走一遍来加深一下理解,以下图为例:

  

浅入浅出数据结构(25)——最小生成树问题

  假设我们以v3作为起点,则图初始化后的状态如下(顶点旁有红圈表示该顶点已知,红圈中即该顶点的preV,顶点的distance我们暂不考虑):

  

浅入浅出数据结构(25)——最小生成树问题

  接着,我们找出所有已知顶点(v3)邻接的所有未知顶点:v0、v1、v2、v4、v5、v6。发现与已知顶点邻接边最小的未知顶点是v1、v4,其中未知顶点v1与已知顶点v3的邻接边权重为1,未知顶点v4与已知顶点v3的邻接边权重也为1,我们任选其一即可,比如选择v1,然后将v1设为已知,v1.preV=v3:

  

浅入浅出数据结构(25)——最小生成树问题

  继续,我们找出所有已知顶点(v1、v3)邻接的所有未知顶点:v0、v2、v4、v5、v6,发现与已知顶点邻接边最小的未知顶点是v0、v4,其中未知顶点v0与已知顶点v1的邻接边权重为1,未知顶点v4与已知顶点v1或v3的邻接边权重为1,我们任选其一,比如v4,然后将v4设为已知,v4.preV=v1(也可以是v4.preV=v3):

  

浅入浅出数据结构(25)——最小生成树问题

  继续,我们找出所有已知顶点(v1、v3、v4)邻接的所有未知顶点:v0、v2、v5、v6,发现与已知顶点邻接边最小的未知顶点是v0、v6,其中未知顶点v0与已知顶点v1的邻接边权重为1,未知顶点v6与已知顶点v4的邻接边权重为1,我们选v6,将v6设为已知,v6.preV=v4:

  

浅入浅出数据结构(25)——最小生成树问题

  继续,我们找出所有已知顶点邻接的所有未知顶点:v0、v2、v5,其中与已知顶点的邻接边最小的是v0,未知顶点v0与已知顶点v1的邻接边权重为1,我们将v0设为已知,v0.preV=v1:

  

浅入浅出数据结构(25)——最小生成树问题

  继续,找出所有已知顶点邻接的所有未知顶点:v2、v5,发现其中未知顶点v5与已知顶点v6的邻接边权重最小为2,所以我们将v5设为已知,v5.preV=v6:

  

浅入浅出数据结构(25)——最小生成树问题

  继续,找出所有已知顶点邻接的所有未知顶点:v2,其中未知顶点v2与已知顶点v5的邻接边权重最小,所以我们将v2设为已知,v2.preV=v5:

  

浅入浅出数据结构(25)——最小生成树问题

  继续,发现已经没有哪个已知顶点邻接了未知顶点,所以算法结束。

  接下来,我们只要进行这两步操作就可以得出最小生成树:

  1.将每个顶点与其preV相连的边标为已知

  2.将非已知的边删去。

  将每个顶点与其preV相连的边标为已知(注意,v3的preV是自身,此情况我们不做任何操作即可):

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsjww.html