当前位置:首页python > 正文

Python 算法:最小生成树(Prim 算法)

作者:野牛程序员:2025-12-22 11:28:57python阅读 2014
Python 算法:最小生成树(Prim 算法)
# /*
# Python 算法:最小生成树(Prim 算法)
# --------------------------------------------------------
# 原理:
# Prim 算法是一种贪心算法,用于求解带权无向图的最小生成树(MST)。
# 步骤:
# 1) 从任意顶点开始,将其加入 MST 集合;
# 2) 在所有与 MST 相连的边中选择权值最小的边,将该边另一端顶点加入 MST;
# 3) 重复步骤 2,直到所有顶点都在 MST 中。
#
# 适用场景:
# - 无向连通图
# - 需要求最小生成树以减少总成本
# */

import sys

# --------------------------------------------------------
# 示例图(邻接矩阵表示,0 表示无连接)
graph = [
    [0, 2, 0, 6, 0],
    [2, 0, 3, 8, 5],
    [0, 3, 0, 0, 7],
    [6, 8, 0, 0, 9],
    [0, 5, 7, 9, 0]
]

def prim_mst(graph):
    num_vertices = len(graph)
    selected = [False] * num_vertices  # 顶点是否已加入 MST
    selected[0] = True                  # 从顶点 0 开始

    mst_edges = []  # 存储 MST 边 (u, v, weight)

    for _ in range(num_vertices - 1):
        min_weight = sys.maxsize
        u = v = -1
        for i in range(num_vertices):
            if selected[i]:
                for j in range(num_vertices):
                    if not selected[j] and graph[i][j]:
                        if graph[i][j] < min_weight:
                            min_weight = graph[i][j]
                            u, v = i, j
        mst_edges.append((u, v, min_weight))
        selected[v] = True

    return mst_edges

# --------------------------------------------------------
# 演示
mst = prim_mst(graph)
print("最小生成树边列表 (u, v, weight):")
for edge in mst:
    print(edge)

# --------------------------------------------------------
# 输出示例:
# 最小生成树边列表 (u, v, weight):
# (0, 1, 2)
# (1, 2, 3)
# (0, 3, 6)
# (1, 4, 5)
#
# 要点总结:
# 1) Prim 算法贪心策略:每次选择连接 MST 的最小边;
# 2) 时间复杂度:
#    - 使用邻接矩阵 O(V^2)
#    - 使用优先队列 + 邻接表 O(E log V)
# 3) 保证生成的树覆盖所有顶点且总权值最小;
# 4) 适合稠密图实现。
# */

#
# 最小生成树边列表 (u, v, weight):
# (0, 1, 2)
# (1, 2, 3)
# (1, 4, 5)
# (0, 3, 6)


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • Python 算法:最小生成树(Prim 算法)
  • 相关推荐

    最新推荐

    热门点击