python实现 CCF2019-3-5 317子任务

RequireFile.do?fid=5JN3gnBNuploading.4e448015.gif转存失败重新上传取消

1.思路分析

使用warshell算法就算最短路径,然后将据点的距离提出来进行排序,但是运行超时,不知道有没有大神指导一下

2.零分代码(运行超时)

import math
 
def shortDistance(dis):
    node_num = len(dis)
    for i in range(node_num):         # 十字交叉法的位置位置,先列后行
        for j in range(node_num):     # 列 表示dis[j][i]的值,即j->i
            for k in range(node_num): # 行 表示dis[i][k]的值,即i->k,i只是一个桥梁而已
                # 先列后行,形成一个传递关系,若比原来距离小,则更新
                if dis[j][k] > dis[j][i] + dis[i][k]:
                    dis[j][k] = dis[j][i] + dis[i][k]
    return dis
 
n,m,k=list(map(int,input().strip().split()))
tag = list(map(int,input().strip().split()))
 
# 邻接矩阵初始化
graph = []
for i in range(n):
    graph.append([math.inf]*n)
    graph[i][i] = 0
    
for i in range(m):
    temp = list(map(int,input().strip().split()))
    temp[0] -= 1
    temp[1] -= 1
    if graph[temp[0]][temp[1]] > temp[2]:
        graph[temp[0]][temp[1]]=temp[2]
        graph[temp[1]][temp[0]]=temp[2]
 
 
 
dis = shortDistance(graph)
 
result = []
for i in range(n):
 
    data = []   # 获取i点到每个据点的距离
    for j in range(n):
        if tag[j] == 1:
            data.append(dis[i][j])
 
    data.sort() # 排序
 
    ans = 0     # 获取前K个最短距离之和
    for j in range(k):
        if data[j]!=math.inf:
            ans += data[j]
        else:
            break
    result.append(ans)
print("\n".join(map(str,result)))

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值