ps:好久没写新文章了,来到了广州见习,没有网络,也不知道这学校怎么想的!!接下来进入正题
何谓最小生成树
对于一个带权连通无向图G中的不同生成树,各棵树的边上的权值之和可能不同,边上的权值之和最小的树称之为该图得最小生成树
构造方法
求图得最小生成树的俩个算法,即普利姆算法和克鲁斯卡尔算法
普利姆算法(Prim)
在了解普利姆算法之前,先想想我们最开始的目的是什么?俗气一点说就是画路线图,而且这个路线必须是最短的。
思路
先用抽象一点的语言描述,就是现在我们先拿出图中的第一个顶点(其实可以是任意顶点),然后把这个顶点放进集合A中,然后将这个顶点与集合外的顶点连成的线的权值做比较,把那个能连权值最小的线的顶点也放进集合里面。然后再把集合里面的俩个顶点与集合外的顶点继续比较,重复此步骤。可以参考:
第一步:从①开始,①进集合,用与集合外所有顶点能构成的边中找最小权值的一条边
①——②权6
①——③权1 -> 取①——③边
①——④权5
第二步:③进集合,①,③与②,④,⑤,⑥构成的最小边为
①——④权5
③——⑥权4 -> 取③——⑥边
第三步:⑥进集合,①,③,⑥与②,④,⑤构成的各最小边
①——②权6
③——②权5
⑥——④权2 -> 取⑥——④边
第四步:④进集合,①,③,⑥,④与②,⑤构成的各最小边
①——②权6
③——②权5 -> 取③——②边
⑥——⑤权6
第四步:②进集合,①,③,⑥,②,④与⑤构成的各最小边
②——⑤权3 -> 取②——⑤边
没错上面的说法很好,但实际中的代码跟上面的思想是一样,但就有点难理解,我们换一种说法,从代码的角度来分析。
假如我们现在拿到手的是一个邻接矩阵存储方法的图(假设这个图有n个顶点)
1.那么首先我们先实例化一个数组A,一个数组B。先这么规定,数组A存储的是n-1条边的权值。那么另外一个数组就是存储边的起始顶点。举个例子A[1]=3,B[1]=4,代表的就是第一个顶点所连接的最短的边的权值是3,然后这条最短边是和第4个顶点连接而成的。
2.那么有了这俩个数组,事情就变得好办很多了。B[i]=k代表的就是i与k连接可以形成最小权值的边,而A[i]数组就代表i顶点与这个k(k=B[i])连接的边的那个最小权值。这里有点绕口。
从实际例子来讲思路比较好,先看看下图ÿ