题目:


这题很明显就是用迪杰斯特拉算法啦,想尝试一下用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 与实际一致
这篇博客介绍了如何使用Python实现迪杰斯特拉算法解决PAT甲级1003题。目前实现了计算从起点到终点的最短路径长度,作者表示对Python编写这类算法仍不太熟练。
&spm=1001.2101.3001.5002&articleId=102491238&d=1&t=3&u=c4f786c82ad94e87ae0f96c66ffc8e5f)
581

被折叠的 条评论
为什么被折叠?



