破圈法求最小生成树+最小生成树与最短路径问题

Posted ljy1227476113

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了破圈法求最小生成树+最小生成树与最短路径问题相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 图2和图3都是树,但是图3是最小生成树,他的路径之和更小

技术图片

 

 

技术图片

 

 技术图片

 

 技术图片

 

 

技术图片

 

 技术图片

 

 技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 

代码

import networkx as nx
import matplotlib.pyplot as plt
tupo=[[0,2,2,0,3,0],
       [2,0,5,1,4,0],
       [2,5,0,2,6,4],
       [0,1,2,0,0,3],
       [3,4,6,0,0,0],
       [0,0,4,3,0,0]]

def circle(tupo,st):
    result=[]
    def trace(path,tupo,now):
        if len(result)==1:return
        if now==st and len(path)>2:
            result.append(list(path))
            return
        for i in range(len(tupo)):
            if tupo[now][i]==0 or i in path:continue
            path.append(i)
            trace(path,tupo,i)
            path.pop()
    trace([],tupo,st)
    if len(result)!=0:
        result[0].insert(0,st)
        return result[0]
    return result

def des_cir(tupo,st):
    n=len(tupo)
    for i in range(n):
        while(1):
            res=[]
            res=circle(tupo,st)
            if len(res)==0:break
            mid_len=0
            mid_st=-1
            for j in range(len(res)-1):
                if tupo[res[j]][res[j+1]]>mid_len or (tupo[res[j]][res[j+1]]==mid_len and res[j]+res[j+1]>res[mid_st]+res[mid_st+1]):
                    mid_len=tupo[res[j]][res[j+1]]
                    mid_st=j
            tupo[res[mid_st]][res[mid_st+1]]=tupo[res[mid_st+1]][res[mid_st]]=0
    for item in tupo:
        print(item)
des_cir(tupo,0)
def draw(tupo):
    nodes=[
    A,
    B,
    C,
    D,
    E,
    F]
    G=nx.Graph()
    for node in nodes:
        G.add_node(node)
    edges=[]
    for i in range(len(tupo)):
        for j in range(len(tupo)):
            if tupo[i][j]!=0:
                edges.append((nodes[i],nodes[j]))
     
    r=G.add_edges_from(edges)
    nx.draw(G, with_labels=True,node_color=y,)
    plt.show()
draw(tupo)

效果图

技术图片

 

 

技术图片

 

 注意的是,最小生成树与最短路径是不一样的

最小生成树只能保证路径之和最小而不能保证任意两点之间路径最小

如上图1拓扑,最小生成树图2的A到D是7,2跳

最短路径A到D是6,1跳

 

END

以上是关于破圈法求最小生成树+最小生成树与最短路径问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥破圈法和避圈法为啥不能求一点至另一点的最短距离

怎么求一幅图像的最小生成树

经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)

QM for Windows 之网络流模型(最小生成树问题)

最小生成树 求大神解救

如何画出最小生成树即最小支撑树?