如何求最小生成树,最小生成树算法代码
1.克鲁斯卡尔算法(浅草)思想
该算法基于贪婪思想。在有n个顶点的连通网络G={V,E}中,最初假设每个顶点是一个孤立点,这是一个无边不连通图g={ v,E},图中每个顶点都有一个连通分量。将边按重量从小到大的顺序排列,依次选择边,当边的两个顶点在不同的连通分量上时,将边加到g’上;否则,切掉这一边,重新选择下一边。重复这一过程,直到所有顶点都在同一个连通分量上。
2.算法流程
输入:图g(v,e)))))))。
输出:g的最小生成树
表示一个无向图b .用Kruskal求无向图b的最小生成树。
首先根据每条边的权重从小到大,选择权重最小的边(A,D)。由于A、D不在同一棵树上,所以顶点A、D被合并。
有树。
然后,在剩下的边中找出权重最小的边,找出顶点为C和E的树,其中(C,E),C和E不在同一棵树上。
重复上述步骤,直到所有顶点都具有相同的连通分量。
这样就找到了有向图B的最小生成树。
3.python的实现
要找到上面有向图B的最小生成树,请使用python实现。
# coding 3360 utf-8 fromplabimport * INF=float(INF))邻接矩阵是vexs=array ([0,7,INF,5,INF,inf],# # C [5,9,9] 0,11],#f 0)) glengthvex=len(vexs)邻接矩阵的大小begin edge=[]EndEdge=[]weight=[]group=[]for narange)LED J]0和vexs [I,J(infinity) :beginedge.append(I)开始j))每条边的权重lengthedge=len(weight)边数sum=0 for iiranage(length edge):#)I=(arg sort)每条边的权重)0)=n: #确定当前边是否属于不同的连通分量,如果是,则合并组[m]=group[m][n][n]=[]sum=sum Weight[I]删除通过边的打印(thelengthofteminiumcostspanningtreeis 3360,sum):
5,5,6,7,7,9表示构成最小生成树的边的权重,权重之和为39。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。