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

    你可能感兴趣的文章
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+Tomcat性能监控
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx用户认证
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的使用总结(二)
    查看>>
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>