图--最小生成树(prim)

其他图相关章节

概念

    既连通又不存在回路,它是图的极小连通子图,包括了所有顶点,对于n个顶点的连通图的生成树一定有n-1条边,其中任意两点之间有且只有一条路径

    由于一个图存在多个生成树,对于网来说,最小指的是权值和最小的生成树

    连通子图即生成树

    最小生成树不唯一

    理论基础:MST性质

MST性质

    若图G是一个连通图,从顶点表(V)中挑选某一顶点U,剩余的顶点记作v=V-U。则从顶点U到顶点v中邻接的点中所构成的边中的最小权值边将构成一颗最小生成树

核心

    选顶点

适用

    稠密图

实现方式

    邻接矩阵+普利姆(prim)

     边集数组+kruskal

时间复杂度

        O

图示

    假设图为

    设TE={},标识最小生成树的边集合,从顶点集合中挑选顶点A作为起始顶点,记作U={A},挑选剩余的顶点记作v

    从A查找邻接点,其所构成的最小权值边并入到U,此时U={A,F},u={B,C,D,E}

(A的邻接边权值最小为1,由于1已加入故忽略,则最小为6;F的最小邻接权值为4,由于4<6故并入)

    分别从A,F查找邻接点,比较两点邻接点的最小权值边并入到U,此时U={A,F,D},u={B,C,E}

    分别从A,F,D查找邻接点,比较三点邻接点的最小权值边并入到U,此时U={A,F,D,C},u={B,E}

(此时最小边有三个,均为6,挑选其一即可)

    分别从A,F,D,C查找邻接点,比较四点邻接点的最小权值边并入到U,此时U={A,F,D,C,E},u={B}

    最后将B点并入,算法结束,其最小生成树如下

(可以看出,这和dfs的过程是近乎一致的,只不过它并不是随机选择深入的)

JavaScript代码实现

    基于邻接矩阵构建无向图

        1-根据顶点表初始化邻接矩阵,值默认无穷大

        2-根据边数构造邻接矩阵(找边的双端点在顶点表的位置)

    最小生成树

        1-按照顶点数初始化两个一维数组a,b,数组a用于记录生成树的顶点下标,初始为全部为0,数组b用于记录权值初始为挑选的第一个顶点的邻接权值

            a[0]=0和b[0]=0标识,挑选顶点A作为生成树的起点

        2-在双for循环中查找权值最小的边并做更新处理

            在权值数组中查找最小值并更新ab数组:找到的k即顶点对应的下标,存入a;将下标对应的顶点并入生成树,即b[k]=0,作为第一次查找到的顶点为F,则b[5]=0,a[1]=5

            由于A的顶点邻接边权值已经在b中,此时只需要将F的顶点邻接权值加入即可。AF的邻接权值如下

            即邻接边有:AB、AC、AF、FB、FC、FD、FE,因此下一轮会从这七条边中查找最小权值。由于AF已经被使用,故实际上是6条,显然应当为4

            同时与AF相关的点有多个,如B和C与AF均有关,但是我们并不需要每个都记录,只需要取较小即可,如BA和BF,取BF即可。至于剩下的只与F相关的通通加入下一次待对比的数组b中即可

你可能感兴趣的:(图--最小生成树(prim))