最小生成树陈旭龙•对于一张图进行深度优先搜索或者广度优先搜索,可生成一棵搜索树
搜索的出发点不同,生成树的形态亦不同
•在一张带权的无向连通图中,各边权和为最小的一棵生成树即为最小生成树
应用举例•已知某乡管辖的村庄都是有路可通的,且相邻村庄间公路的长度已知
现在要沿公路架设电线,使各村之间都通电话,问应该怎样架线才能使所用的电线最少
最小生成树的计算策略•计算最小生成树采用的是贪心策略,即必须保证每次添加的边同时满足下述两个条件:•(1)不能形成回路;•(2)在保证条件1的前提下添加权尽可能小的边,这样的边称之为安全边
Kruskal算法•初始时,森林是由单个节点组成的n棵树
然后反复找出森林中连接任意两棵树的所有边中具有最下权值的边(u,v),将其作为安全边,把它添加到正在生长的森林中,直至产生最小生成树为止
12345678Kruskal算法思路•设节点数n,边数为m;所有边按照权值递增的顺序排列成边集e,其中第i条边为(e[i]
x,e[i]
y),该边的权为e[i]
c;并查集为f,其中f[i]为节点i所在并查集的代表节点,即子树根
主算法如下:procedurekruskal{qsort(1,n);//按照边权值递增的顺序排序边集efori:=1tondof[i]:=i;//并查集,初始化每棵树fori:=1tomdounion(e[i]
x,e[i]
y,e[i]
c)}procedureunion(i,j,c:longint);varx,y:longint;{x:=getfather(i);y:=getfather(j);ifxythen{inc(ans,s);f[y]:=x;}}functiongetfather(i:longint):longint;{ifif[i]thenf[i]:=getfather(f[i]);exit(f[i]);}Kruskal