python最小生成树kruskal与拘谨的算法详解

  

kruskal算法基本思路:先对边按权重从小到大排的序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。

  

拘谨的算法基本思路:所有节点分成两个组,一个为已经选取的selected_node(为列表类型),一个为candidate_node,首先任取一个节点加入到selected_node,然后遍历头节点在selected_node,尾节点在candidate_node的边,选取符合这个条件的边里面权重最小的边,加入到最小生成树,选出的边的尾节点加入到selected_node,并从candidate_node删除。直到candidate_node中没有备选节点(这个循环条件要求所有节点都有边连接,即边数要大于等于节点数1,循环开始前要加入这个条件判断,否则可能会有节点一直在候选人中,导致死循环)。

        #=utf - 8编码   类图(对象):   def __init__(自我、地图):   自我。地图=地图   自我。nodenum=self.get_nodenum ()   自我。edgenum=self.get_edgenum ()      def get_nodenum(自我):   返回len (self.maps)      def get_edgenum(自我):   数=0   因为我在范围(self.nodenum):   j的范围(我):   如果自我。地图[我][j]比;0和自我。地图[我][j] & lt;9999:   数+=1   返回数      def kruskal(自我):   res=[]   如果自我。nodenum & lt;=0或自我。edgenum & lt;self.nodenum-1:   返回res   edge_list=[]   因为我在范围(self.nodenum):   self.nodenum j的范围(我):   如果自我。地图[我][j] & lt;9999:   edge_list。追加([j,我self.maps[我][j]]) #按(开始、结束、重量)形式加入   edge_list。sort(关键=λ:[2])#已经排好序的边集合      组=[[我]我的范围(self.nodenum)]   在edge_list边缘:   因为我在范围(len(集团)):   如果边缘[0][我]:组   m=我   如果边缘集团[我][1]:   n=我   如果m !=n:   res.append(边缘)   集团[m]=[m] + [n]组   集团[n]=[]   返回res      def的(自我):   res=[]   如果自我。nodenum & lt;=0或自我。edgenum & lt;self.nodenum-1:   返回res   res=[]   seleted_node=[0]   candidate_node=[我的范围内(self.nodenum)]      len (candidate_node)比;0:   开始,结束,minweight=0, 0, 9999   因为我在seleted_node:   在candidate_node j:   如果自我。地图[我][j] & lt;minweight:   minweight=self.maps[我][j]   开始=我   结束=j   res.append((开始、结束minweight))   seleted_node.append(结束)   candidate_node.remove(结束)   返回res      max_value=https://www.yisu.com/zixun/9999   max_value row0=[0, 7日,max_value, max_value, 5]   第一行=[7 0 9 max_value 3, max_value]   row2=[max_value max_value 9 0, 6日,max_value]   row3=[max_value max_value 6 0 8 10]   row4=[max_value 3 max_value 8 0, 4]   row5=[5, max_value max_value 10 4 0]   地图=[row0,第一行,row2 row3, row4, row5]   图=图(地图)   打印(“邻接矩阵为\ n % s的% graph.maps)   打印('节点数据为% d,边数为% d \ n ' %(图。nodenum, graph.edgenum))   打印(' - - - - - -最小生成树kruskal算法- - - - - -”)   print (graph.kruskal ())   打印(' - - - - - -最小生成树的算法”)   print (graph.prim ())      

初始的图如下。

  

 python最小生成树kruskal与拘谨的算法详解

  

运行结果如下。

  

 python最小生成树kruskal与拘谨的算法详解

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

python最小生成树kruskal与拘谨的算法详解