算法修仙传 第十六章 秘境探索:最小生成树

第十六章 秘境探索:最小生成树

上古秘境开启,林玄发现需要构建"灵脉网络"连接所有遗迹。石碑提示:“以最小代价连通所有节点,可得传承”。

生成树算法

# Prim算法
def prim_mst(graph):
    mst = defaultdict(set)
    visited = set()
    start_node = next(iter(graph.adj))
    visited.add(start_node)
    edges = [
        (weight, start_node, neighbor)
        for neighbor, weight in graph.adj[start_node]
    ]
    heapq.heapify(edges)
    
    while edges:
        weight, u, v = heapq.heappop(edges)
        if v not in visited:
            visited.add(v)
            mst[u].add((v, weight))
            for neighbor, w in graph.adj[v]:
                if neighbor not in visited:
                    heapq.heappush(edges, (w, v, neighbor))
    return mst

# Kruskal算法
def kruskal_mst(graph):
    parent = {}
    def find(u):
        while parent[u] != u:
            parent[u] = parent[parent[u]]
            u = parent[u]
        return u
    
    mst = defaultdict(set)
    edges = []
    for u in graph.adj:
        parent[u] = u
        for v, weight in graph.adj[u]:
            edges.append((weight, u, v))
    
    edges.sort()
    for weight, u, v in edges:
        root_u = find(u)
        root_v = find(v)
        if root_u != root_v:
            mst[u].add((v, weight))
            parent[root_v] = root_u
    return mst

【算法对比】

  1. Prim:

    • 基于顶点构建
    • 适合稠密图
    • 时间复杂度O(ElogV)
  2. Kruskal:

    • 基于边构建
    • 适合稀疏图
    • 时间复杂度O(ElogE)

秘境挑战

  1. 构建最优灵脉网络:
def build_spirit_network(graph):
    return prim_mst(graph)
  1. 计算最小灵石消耗:
def calculate_min_cost(mst):
    total = 0
    for u in mst:
        for v, weight in mst[u]:
            total += weight
    return total // 2  # 每条边被计算两次
  1. 关键灵脉识别(割边检测):
def find_critical_edges(graph):
    # 使用Tarjan算法
    pass
  1. 冗余灵脉检测(环检测):
def detect_redundant_edges(graph):
    # 使用并查集
    pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tee xm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值