沟通无限校园网-最小生成树(贪心算法-Prim-Python)

该篇文章介绍了如何利用Prim算法在给定的带权无向图中寻找连接大学各部门的最小生成树,以实现最低费用的网络布线。作者通过Python实现了一个普利姆函数,展示了具体步骤和计算过程。
摘要由CSDN通过智能技术生成

题目:

如何设计网络布线,将这所大学的各个单位连通起来,并且使费用最少呢?

备注:代码的无向连通带权图用的是简略图

# 引入堆
import heapq

# 普利姆函数


def prim(graph):
    # 从图中随机选择一个节点作为起始节点
    start_node = list(graph.keys())[0]

    visited = set()  # 存储已访问过的节点
    min_spanning_tree = []  # 存储最小生成树的边
    total_cost = 0  # 总花费

    # 使用优先队列来存储边和对应的权重
    edge_heap = [(0, start_node, None)]  # (权重, 目标节点, 源节点)

    while edge_heap:
        weight, current_node, parent_node = heapq.heappop(edge_heap)

        if current_node not in visited:
            visited.add(current_node)
            if parent_node is not None:
                min_spanning_tree.append((parent_node, current_node, weight))
                total_cost += weight

            for neighbor, neighbor_weight in graph[current_node].items():
                if neighbor not in visited:
                    heapq.heappush(
                        edge_heap, (neighbor_weight, neighbor, current_node))

    return min_spanning_tree, total_cost


# 用字典表示各点之间的距离
graph = {
    '1': {'2': 23, '6': 28, '7': 36},
    '2': {'1': 23, '3': 20, '7': 1},
    '3': {'2': 20, '4': 15, '7': 4},
    '4': {'3': 15, '5': 3, '7': 9},
    '5': {'4': 3, '6': 17, '7': 16},
    '6': {'1': 28, '5': 17, '7': 25},
    '7': {'1': 36, '2': 1, '3': 4, '4': 9, '5': 16, '6': 25}
}

result, cost = prim(graph)
print("Minimum Spanning Tree:")
for edge in result:
    print(edge)
print("Total Cost:", cost)

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值