博客
关于我
最小生成树(Prim)学习、代码实现
阅读量:393 次
发布时间:2019-03-05

本文共 3037 字,大约阅读时间需要 10 分钟。

为了解决这个问题,我们需要构建一个最小生成树,其中必须有一条边连接特定的Nike店和Apple店。我们将使用Prim算法来实现这一点,因为Prim算法能够有效地处理边权重不同的情况,并且适用于较小的点数范围。

方法思路

  • 问题分析:我们需要在给定的点中构建一个最小生成树,并确保特定的两点(Nike店和Apple店)之间有一条边。最小生成树的目标是将所有点连接起来,使得总权重最小。
  • 算法选择:Prim算法适用于解决最小生成树问题,特别是边权重可能不同或相同的情况。我们将使用Prim算法来逐步构建最小生成树。
  • 强制连接节点:在初始化时,我们将强制连接指定的两点(Nike店和Apple店),并将这条边的权重计入总成本。
  • 代码实现:我们将编写一个函数lct,该函数使用Prim算法来计算最小生成树的总权重。函数中的辅助数组closeedge将记录每个节点到起始点的最短距离。
  • 解决代码

    import mathdef main():    import sys    input = sys.stdin.read().split()    ptr = 0    N = int(input[ptr])    ptr += 1    while N != 0:        p = int(input[ptr])        q = int(input[ptr+1])        ptr += 2        pos = [[0.0 for _ in range(2)] for __ in range(N+1)]        for i in range(1, N+1):            pos[i][0] = float(input[ptr])            pos[i][1] = float(input[ptr+1])            ptr += 2        # Initialize distance matrix        a = [[math.inf for _ in range(N+1)] for __ in range(N+1)]        for i in range(1, N+1):            for j in range(i, N+1):                if i == j:                    a[i][j] = 0.0                else:                    a[i][j] = math.hypot(pos[i][0] - pos[j][0], pos[i][1] - pos[j][1])        a[p][q] = 0.0  #强制连接p和q        a[q][p] = a[p][q]        # Prim算法实现        def lct(n, sta):            lowcost = 0.0            # 初始化closeedge数组            closeedge = [ {'vis': False, 'dis': math.inf} for _ in range(n+1)]            closeedge[sta]['vis'] = True            closeedge[p]['vis'] = True            closeedge[q]['vis'] = True            for j in range(1, n+1):                if j != sta and j not in [p, q]:                    closeedge[j]['dis'] = a[sta][j]            # 计算初始lowcost            lowcost += a[p][q]            # 更新其他节点的最短距离            for j in range(1, n+1):                if j not in [p, q] and closeedge[j]['vis'] == False:                    if a[q][j] < closeedge[j]['dis']:                        closeedge[j]['dis'] = a[q][j]            # 开始循环找最短边            for i in range(3, n+1):                min_dist = math.inf                min_j = -1                for j in range(1, n+1):                    if closeedge[j]['vis'] == False and closeedge[j]['dis'] < min_dist:                        min_dist = closeedge[j]['dis']                        min_j = j                if min_j == -1:                    break                lowcost += min_dist                closeedge[min_j]['vis'] = True                # 更新其他节点的最短距离                for j in range(1, n+1):                    if closeedge[j]['vis'] == False and a[min_j][j] < closeedge[j]['dis']:                        closeedge[j]['dis'] = a[min_j][j]            return lowcost        total_cost = lct(N, p)        # 输出结果,保留两位小数        print("{0:.2f}".format(total_cost))        N = int(input[ptr])    returnif __name__ == "__main__":    main()

    代码解释

  • 读取输入:首先读取输入数据,包括点的数量、特定的两点以及每个点的坐标。
  • 初始化距离矩阵:使用欧几里得距离计算每对点之间的距离,存储在矩阵a中。
  • 强制连接节点:在初始化时强制将指定的两点连接,并将这条边的权重计入总成本。
  • Prim算法实现:函数lct使用Prim算法来计算最小生成树的总权重。辅助数组closeedge记录每个节点到起始点的最短距离。
  • 输出结果:计算并输出最小生成树的总权重,保留两位小数。
  • 通过这种方法,我们可以确保在构建最小生成树时,特定的两点(Nike店和Apple店)之间有一条边,并且总权重最小。

    转载地址:http://mdkzz.baihongyu.com/

    你可能感兴趣的文章
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>
    Python:用渐进式数字重命名列表中的重复项而不对列表进行排序
    查看>>
    Python:矩形参数无效
    查看>>
    Python:语法进阶
    查看>>
    Python:调用复制函数时调用 Python 对象时超出了最大递归深度
    查看>>
    Python:这两个 import 语句有什么区别?
    查看>>
    Python:通过串口从 Velleman k8090 读取数据
    查看>>
    python:遍历具有列表值的字典
    查看>>
    Python:降低精度 pandas 时间戳数据帧
    查看>>
    python:非阻塞子进程,检查标准输出
    查看>>