博客
关于我
最小生成树(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/

    你可能感兴趣的文章
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NUUO网络视频录像机 upload.php 任意文件上传漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    nvidia 各种卡
    查看>>
    Nvidia 系列显卡大解析 B100、A40、A100、A800、H100、H800、V100 该如何选择,各自的配置详细与架构详细介绍,分别运用于哪些项目场景
    查看>>
    NVIDIA-cuda-cudnn下载地址
    查看>>
    nvidia-htop 使用教程
    查看>>