pat甲级1003的python实现(没写完)

这篇博客介绍了如何使用Python实现迪杰斯特拉算法解决PAT甲级1003题。目前实现了计算从起点到终点的最短路径长度,作者表示对Python编写这类算法仍不太熟练。
摘要由CSDN通过智能技术生成

题目:
在这里插入图片描述
在这里插入图片描述

这题很明显就是用迪杰斯特拉算法啦,想尝试一下用python实现,这次没打完,算是做了一半吧 orz ,目前只实现了求得从起点到终点的最短路径长度,接下来的代码应该也不难,再给每个点赋权值就行了,用python写这种刚开始真有点不习惯的说

graph={}
costs={}
infinity=float("inf")

str=input()
num=[int(n) for n in str.split()]

n=num[0]
m=num[1]
c1=num[2]
c2=num[3]       #获取n,m,c1,c2
#给每个城市的救援队的数量赋值这一环节先跳过(有点懒),直接对每条路赋值
for i in range(m):
    str = input()
    Num = [int(n) for n in str.split()]

    if Num[0]==c1:
        costs[Num[1]]=Num[2]
    else:
        costs[Num[1]]=infinity      #构建costs散列表 暂时从起点来看不可达的点的值设置为无穷大

    try:
        graph[Num[0]].values()
    except:
        graph[Num[0]]={}
    try:
        graph[Num[1]].values()
    except:
        graph[Num[1]] = {}          #如果目标字典不存在,则构建该字典

    graph[Num[0]][Num[1]]=Num[2]        #构建graph散列表,它是一个二维字典

processd=[] #记录已经访问过的点
#算法核心是先构建graph这个二维散列表,第一维存与每个城市相邻的其他城市,第二维存每个城市之间道路的权值
#graph里的值都是定值
#然后构建costs这个一维散列表,存目前从起点去其他点的最短距离(会一直更新)
def find_lowest_cost_node(costs):   #获取costs中距离最近的城市
    lower_cost=float("inf")
    lower_cost_node=None
    for node in costs:
        cost=costs[node]
        if cost<lower_cost and node not in processd:
            lower_cost=cost
            lower_cost_node=node
    return lower_cost_node


node=find_lowest_cost_node(costs)
while node is not None:  #如果存在没有访问的城市,就继续执行
    cost=costs[node]
    neighbors=graph[node]  
    for n in neighbors.keys():
        new_cost=cost+neighbors[n]  #目前去某城市的最短距离+它邻居城市的距离
        if costs[n]>new_cost:    #说明目前有去往n城有更短的距离
            costs[n]=new_cost   #更新costs散列表
    processd.append(node)   #代表已经结束对该点的访问
    node=find_lowest_cost_node(costs)

print(costs[c2])

在这里插入图片描述
使用题目中的测试用例(略去给每个城市里的救援队人数赋值的操作)
得出从c1城到c2城的最短距离为2 与实际一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值