前文简单介绍了最小生成树的概念,下面在matlab中实际操作一番。
在《图论——一个迷人的世界》这本书中,笔者找到了一个例题,如图1
图1 一道最小生成树例题
首先我们使用先前介绍的Kruskal算法解题。
解:
选择图G中权值为5的最小权边v3v8,继续选择最小权边,v7v8和v3v7权值为7都可以入选,但是由于k>=2的条件(可以回看此算法定义),需要选取的边不能和之前最小权边组成圈,因此只能选一个,笔者选取v7v8。
有两条权为8的,都选择后会形成圈,因此选择一条加入T(所求的最小生成树),选择v3v4。
有两条权为9的,同样选v2v8,有两条权为10的,由于两条都加入也形不成圈,因此都加入。
有一条权为11的,然而选择它会形成圈,因此不选。
有三条权为12的,v5v6会导致出现圈,因此不能选择,选择v1v2或者v1v8都能得到一个最小生成树,选择v1v2。
得到T是一棵最小生成树,总权值为61,如图2所示
图2 例题的解
之后我们在matlab下进行求解:
根据图1的加权图G,在matlab中输入点和边的信息,
s = [1 1 2 2 3 3 3 4 4 4 5 6 7];
t = [2 8 3 8 4 7 8 5 6 7 6 7 8];
weights = [12 12 9 9 8 7 5 10 10 8 12 11 7];
G = graph(s,t,weights);
p = plot(G,'EdgeLabel',G.Edges.Weight);
图3 matlab中plot图G
通过指令minspantree即可求解
[T,pred] = minspantree(G);
highlight(p,T)
之后得到的图同样为总权值为61的最小生成树
图4 高亮的边组成最小生成树T