Maktub_Wiki Maktub_Wiki
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 第2章 算法基础

    • 2.1 插入排序
    • 2.2 算法分析
    • 2.3 设计算法
  • 第6章 堆排序

    • 6.2 维护堆的性质
    • 6.3 建堆
    • 6.4 堆排序算法
    • 6.5 优先队列
  • 第7章 快速排序

    • 7.1 快速排序的描述
  • 第8章 线性时间排序

    • 8.2 计数排序
    • 8.4 桶排序
  • 第12章 二叉树搜索

    • 12.1 什么是二叉树搜索
    • 12.3 插入和删除
  • 第13章 红黑树

    • 13.1 红黑树的性质
    • 13.2 旋转
  • 第15章 动态规划

    • 15.4 最长公共子序列
  • 第23章 最小生成树

    • 23.2 Kruskal算法和Prim算法
      • Kruskal算法
        • 代码
      • Prim算法
        • 代码
  • 第24章 单源最短路径

    • 24.1 Bellman-Ford算法
    • 24.3 Dijkstra算法
  • 第25章 所有结点对的最短路径问题

    • 25.2 Floyd-Warshall算法
    • 25.3 用于稀疏图的Johnson算法
  • 第31章 数论算法

    • 31.2 最大公约数
    • 31.6 元素的幂
  • 第32章 字符串匹配

    • 32.4 Knuth-Morris-Pratt算法
  • 算法导论
  • 第23章 最小生成树
Maktub_小明
2024-08-22
目录

23.2 Kruskal算法和Prim算法

# Kruskal算法

一种贪心算法,从最小的边开始遍历,并用并查集判断是否为同一个路径内

# 代码

# 并查集
def find(parent, node):
    if parent[node] != node:
        parent[node] = find(parent, parent[node])
    return parent[node]

def union(parent, rank, node1, node2):
    root1 = find(parent, node1)
    root2 = find(parent, node2)

    if root1 != root2:
        if rank[root1] > rank[root2]:
            parent[root2] = root1
        elif rank[root1] < rank[root2]:
            parent[root1] = root2
        else:
            parent[root2] = root1
            rank[root1] += 1

def kruskal(graph):
    min_spanning_tree = []
    edges = []

    for node, neighbors in graph.items():
        for neighbor, weight in neighbors.items():
            edges.append((weight, node, neighbor))

    edges.sort()

    parent = {node: node for node in graph}
    rank = {node: 0 for node in graph}

    for edge in edges:
        weight, node1, node2 = edge
        if find(parent, node1) != find(parent, node2):
            union(parent, rank, node1, node2)
            min_spanning_tree.append((weight, node1, node2))

    return min_spanning_tree

# Prim算法

# 代码

#G是路径图,s是开始点
def prim(G, s):
    P, Q = {}, [(0, None, s)]
    while Q:
        w, p, u = heappop(Q)
        if u in P: continue # 如果目标点在生成树中,跳过
        P[u] = p # 记录目标点不在生成树中
        for v, w in G[u].items():
            heappush(Q, (w, u, v)) # 将u点的出边入堆
    return P
# T = prim(G, 1)
# sum_count = 0
# for k, v in T.items():
# if v !=None:
# sum_count += G[k][v]
#
# print(sum_count)
# print(T)
# 结果为19
# {1: None, 2: 1, 3: 1, 4: 3, 5: 6, 6: 4}
上次更新: 2025/08/03, 09:26:17
15.4 最长公共子序列
24.1 Bellman-Ford算法

← 15.4 最长公共子序列 24.1 Bellman-Ford算法→

Theme by Vdoing | Copyright © 2021-2025 Maktub_小明 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式