python求最小生成树

对于图的一个经常会遇到的问题,关于如何求有向连通图最小生成树的问题,这里的最小生成树的含义是保证图中的所有顶点是相互连通的,并且保证路径之和最小的连通子图。

对于给定的graph是个二维列表,以及一个point表,这里分别用于表示一个有向连通图各顶点之间的距离,以及个顶点的名称,对这个图进行求解最小生成树如何构建,以及求这个最小生成树路径的和。

添加图片注释,不超过 140 字(可选)

对于给定的如上的graph和point,得出的最小生成树以及该树的最小生成树路径之和的值为:

添加图片注释,不超过 140 字(可选)

另外一个给定的例子如下:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

得出的最小生成树以及该树的最小生成树路径之和的值为:

添加图片注释,不超过 140 字(可选)

对于如上的例子,要想求最小生成树的方法中一般会有两种方式,其中prim算法主要采用的是贪心策略,贪心算法策略主要是在每次选取的是长度最小的那条边,prim的主要过程是先以一个顶点为初始顶点,图中所有顶点集合为point,将已经找到的最短路径的顶点集合定义为visited,将到各个顶点的最短路径长度集合定义为length,length的初始值是第一个顶点到各个顶点的距离,如果说对于已经找到最短路径的顶点集合visited列表中已经存在了某一个顶点,则将对应的length值置为-1,这就表示对该顶点不在继续做处理,已经找到了到达该顶点的路径。

然后对visited集合中的顶点找到point-visited集中和顶点的最小边,然后将这条边加入到最小生成树当中去,再同时更新visited和length。重复这个步骤,一直到最后visited中所包含的顶点是图的所有顶点为止。

python实现的代码如下:

复制代码
import sys
MAX=sys.maxsize
def mintree(graph,point):
    visited = [point[0]]
    length = [-1]
    n=len(point)
    for i in range(1,n):
        length.append(graph[0][i])
    sum = 0
    last=[point[0] for _ in range(n)]
    for _ in range(1,n):
        min=MAX
        minindex=0
        for j in range(1,n):
            if length[j]!=-1 and length[j]<min:
               min=length[j]
               minindex=j
        visited.append(minindex)
        sum += length[minindex]
        print(last[minindex], '--', point[minindex])
        length[minindex]=-1
        for j in range(1,n):
            if length[j]!=-1 and graph[minindex][j]<length[j]:
                length[j]=graph[minindex][j]
                last[j]=point[minindex]
    return sum
相关推荐
じ☆冷颜〃29 分钟前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
夜思红尘3 小时前
算法--双指针
python·算法·剪枝
人工智能训练3 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
散峰而望3 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
点云SLAM3 小时前
BOOS库中Graph模块boost::edge_reverse_t和boost::vertex_color_t解读
数据库·edge·图论·bfs·dfs/拓扑排序·boost库、
CoderCodingNo3 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……4 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L4 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智航GIS4 小时前
8.2 面向对象
开发语言·python
蹦蹦跳跳真可爱5894 小时前
Python----大模型(GPT-2模型训练加速,训练策略)
人工智能·pytorch·python·gpt·embedding