matlab下构建最小生成树

前文简单介绍了最小生成树的概念,下面在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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容