用python实现最小生成树--Prim算法

本文介绍了如何使用Matlab从Excel文件中读取邻接矩阵,并实现Prim算法来找到图的最小生成树。通过具体实例展示了算法的执行过程,包括邻接矩阵的生成、最小生成树的构建及最终结果。
摘要由CSDN通过智能技术生成

PS:如果进来是找《用matlab画散点图,并指定点与点之间的连线》这篇文章的,请进这个链接:https://blog.csdn.net/heavenmark/article/details/82794488

一、从Excel导入邻接矩阵

import xlrd
import sys

def matrix(address):                           #读取excel生成邻接矩阵
    wb = xlrd.open_workbook(address)
    sheet1 = wb.sheet_by_name('邻接矩阵_距离')
    L = []
    for i in range(1,13):
        a = sheet1.row_values(i)
        a.remove(a[0])
        L.append([int(x) for x in a])
    # print(L)
    return L

二、实现最小生成树

import matrix
import sys

def get_tree(primgraph,chararray):
    charlist = []
    charlist.append(chararray[0])
    mid = []    #mid[i]表示生成树集合中与点i最近的点的编号
    lowcost = []    #lowcost[i]表示生成树集合中与点i最近的点构成的边最小权值 ,-1表示i已经在生成树集合中
    lowcost.append(-1)
    mid.append(0)
    n = len(chararray)
    for i in range(1,n): #初始化mid数组和lowcost数组
        low
Prim算法是一种用于求解图中最小生成树的经典算法,它适用于无向连接的加权图。在Python实现Prim算法通常会使用优先队列数据结构,如`heapq`模块。以下是Prim算法的基本步骤: 1. **初始选择**:从图中的任意一个顶点开始(通常是权重最低的边),将其添加到已选集合中,并记录其邻接点。 2. **扩展过程**:对于未加入已选集合的每个顶点,检查它与已选集合中的某个顶点相连的一条边,取这条边的权重最小的。将这条边以及与其相连的那个顶点加入到已选集合中。 3. **重复**:重复步骤2,直到所有顶点都被包含在已选集合中,或者无法找到更优的边(这时已选集合构成的就是最小生成树)。 4. **结束**:最后得到的已选集合中的边就是最小生成树的所有边。 ```python import heapq def prim(graph, start): visited = {start: 0} edges = [] for node in graph.keys(): if node != start: edges.append((graph[start][node], node)) heap = [(weight, node) for weight, node in edges] heapq.heapify(heap) min_cost = 0 while heap: weight, node = heapq.heappop(heap) if node not in visited: visited[node] = weight for neighbor, edge_weight in graph[node].items(): if neighbor not in visited: heapq.heappush(heap, (edge_weight, neighbor)) min_cost += edge_weight return min_cost, visited # 示例图 graph = { 'A': {'B': 1, 'C': 5}, 'B': {'A': 1, 'D': 6, 'E': 2}, 'C': {'A': 5, 'D': 1}, 'D': {'B': 6, 'C': 1, 'E': 7, 'F': 9}, 'E': {'B': 2, 'D': 7, 'F': 3}, 'F': {'D': 9, 'E': 3} } start_node = 'A' min_cost, tree = prim(graph, start_node) print(f"最小生成树总成本: {min_cost}") print("生成树节点关系:", tree)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值