数据结构-最小生成树算法

最小生成树经典算法主要是:Prim和Kruskal算法,其核心都是MST性质:假设G=(V,E)是一个无向连通图,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u包含于U,v包含于V,则必存在一颗包含边(u,v)的最小生成树。

Prim算法:我所理解的prim的算法就好像动态规划式的坐公交。

第一步:根据MST性质,我们选择了一条边V2-V4,我们准备一个集合U用来存放已联通部分的定点集合,如果我们被告知从某点出发的话,那么U的初始状态就是U={V1},另外,我们用一个集合T存放路径,由图知,我们可以由v1到达的顶点的集合是{V2,V4,V5},选取权值最小,我们会到达V5,

此时U={V1,V5},T={V1V5};

这个时候我们就有两个出发站点了,我们可以从V1到V4,V2,因为V5我们已经打通了,我们也可以由V5到V2,V3,选取权值最小,

此时U={V1,V5,V2},T={V1V5,V1V2};

下一步,U={V1,V5,V2,V4},T={V1V5,V1V2,V2V4};

下一步U={V1,V5,V2,V4,V6},T={V1V5,V1V2,V2V4,V4V6};

下一步U={V1,V5,V2,V4,V6,V3},T={V1V5,V1V2,V2V4,V4V6,V6V3};

此时,所有顶点已经包含在U中,我们已经找到最小生成树,T就是所有边的集合。

=====两个算法比较的核心写在这里,prim是从我所拥有的站点出发,寻找下一个离我最近,未到达的站点,kruskal的核心是我什么都不管,我就找最小的权值边,但我有一点会考虑,不形成环路,如果最小的边会形成环,我就找倒数第二小的权值,直到形成最小联通图。

Kruskal算法:我什么都不管,我就找最小的权值边,但我有一点会考虑,不形成环路,如果最小的边会形成环,我就找倒数第二小的权值,直到形成最小联通图。

数据结构

猜你喜欢

转载自blog.csdn.net/qq_33420835/article/details/82688629
今日推荐