博客
关于我
最小生成树(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 - 数据描述符(class 内置 get/set/delete方法 )
    查看>>
    Python - 根据值绘制彩色网格
    查看>>
    Python - 正则表达式在括号之间获取数字
    查看>>
    python binascii.Error: Incorrect padding
    查看>>
    Python C 程序子进程在“for line in iter“处挂起
    查看>>
    python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令
    查看>>
    Python CONNECT 4 CHECK WIN函数
    查看>>
    python ctypes库中动态链接库加载方式
    查看>>
    python cv2 图像( np array )转 HObject
    查看>>
    python cv2截取不规则区域图片
    查看>>
    python CV2裁剪图片并保存
    查看>>
    python cv2读取rtsp实时码流按时生成连续视频文件
    查看>>
    Python Dataframe Groupby Mean和Std
    查看>>
    python datetime
    查看>>
    python datetime笔记
    查看>>
    python day01
    查看>>
    python day10
    查看>>
    python decode和encode
    查看>>
    Python Dict 理解创建和更新字典
    查看>>