📜  Prim的最小生成树算法(1)

📅  最后修改于: 2023-12-03 15:33:47.634000             🧑  作者: Mango

Prim的最小生成树算法

Prim算法是一种求解最小生成树的经典算法,它的思想十分简单,也很易于理解,是解决实际问题中非常实用的算法之一。

算法概述

最小生成树是指在一个无向图中,存在能够连接所有节点的子图,且该子图的所有边的权值之和最小。Prim算法的核心思想是通过构造一个从某个顶点开始的生成树,不断向树中添加顶点和边,直到生成整个无向图的最小生成树。

具体步骤如下:

  1. 选取一个任意节点作为起点,将其放入生成树中。
  2. 找到与当前生成树相邻的所有节点,选取其中权值最小的一条边,将该边对应的节点加入生成树中。
  3. 按照以上方法递归执行步骤2,直到生成整个无向图的最小生成树。
算法优化

Prim算法的时间复杂度为O(n^2),其中n为节点个数,即对于每个节点都需要遍历其所有相邻节点以确定最小边。但是,通过使用堆等数据结构来维护节点间的距离,我们可以将 Prim 算法的时间复杂度降至O(mlogn),其中m为边数,n为节点个数。

代码片段

以下是一个使用Python语言实现Prim算法的代码示例,其中使用了堆来维护节点间的距离。

import heapq

def prim(edges, start):
    # 创建一个空的字典用于存储最小生成树
    mst = {}
    # 将所有节点标记为未访问
    visited = set()
    # 将起点加入生成树中
    visited.add(start)
    # 初始化堆
    heap = [(weight, start, end) for start, end, weight in edges if start == 0]
    heapq.heapify(heap)
    
    while heap:
        weight, start, end = heapq.heappop(heap)
        if end not in visited:
            # 将该节点加入生成树
            visited.add(end)
            mst[(start, end)] = weight
            # 将与该节点相邻的未访问节点加入堆中
            for next_start, next_end, next_weight in edges:
                if next_start == end and next_end not in visited:
                    heapq.heappush(heap, (next_weight, next_start, next_end))
                elif next_end == end and next_start not in visited:
                    heapq.heappush(heap, (next_weight, next_end, next_start))
    
    return mst

以上代码实现的Prim算法可以接收一组边和一个起点作为参数,返回最小生成树。需要注意的是,为了简化示例代码,该算法假设输入的无向图联通。