本文共 3037 字,大约阅读时间需要 10 分钟。
为了解决这个问题,我们需要构建一个最小生成树,其中必须有一条边连接特定的Nike店和Apple店。我们将使用Prim算法来实现这一点,因为Prim算法能够有效地处理边权重不同的情况,并且适用于较小的点数范围。
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中。lct使用Prim算法来计算最小生成树的总权重。辅助数组closeedge记录每个节点到起始点的最短距离。通过这种方法,我们可以确保在构建最小生成树时,特定的两点(Nike店和Apple店)之间有一条边,并且总权重最小。
转载地址:http://mdkzz.baihongyu.com/