Description
天气逐渐变冷,年老体弱的越越鸟打算去南方某座温度适宜的城市过冬,但由于翅膀严重老化,最远飞行距离有限,请你为可怜的越越鸟计算飞行所需的最短距离,以让它能做好心理准备。
Input
输入包含多组测试数据。
每组输入第一行为两个正整数n(n<=20)和m(m<=n*(n-1)/2),n表示城市个数,m表示线段个数。(线段为两个城市间的连接线)
接下来m行,每行输入三个整数a,b,和l(l<=10^9),表示a市与b市之间存在一条线段,线段长度为l。(a与b不同)
每组最后一行输入两个整数x和y,表示问题:x为越越鸟现在所在的城市,y为越越鸟打算飞往过冬的城市。城市标号为1~n。
Output
对于每组输入,输出x市与y市之间的最短距离,如果x市与y市之间非连通,则输出“No path”。
Samples
input
4 4
1 2 4
1 3 1
1 4 1
2 3 1
2 4
output
3
代码:
def dijkstra_shortest_distant(n, m, edges, x, y):
dicts = [float('inf')] * n
dicts[x - 1] = 0
visited = [False] * n
graph = [[float('inf')] * n for _ in range(n)]
for a, b, l in edges:
graph[a - 1][b - 1] = graph[b - 1][a - 1] = l
for _ in range(n):
min_dict = float('inf')
u = -1
for v in range(n):
if not visited[v] and dicts[v] <= min_dict:
min_dict = dicts[v]
u = v
if u == -1:
break
visited[u] = True
for v in range(n):
if not visited[v] and graph[u][v] != float('inf'):
dicts[v] = min(dicts[v], dicts[u] + graph[u][v])
if dicts[y - 1] == float('inf'):
print('No path')
else:
print(dicts[y - 1])
while True:
try:
n, m = map(int, input().split())
edges = [list(map(int, input().split())) for _ in range(m)]
x, y = map(int, input().split())
dijkstra_shortest_distant(n, m, edges, x, y)
except EOFError:
break
要点:
1.可以把float('inf)定义成变量INF,之后直接调用
2.创建二维矩阵和一维矩阵以的问题
[INF] * n 可以创建一维列表,且每个列表中的INF都是独立的
[[INF] * n] 创建的二维列表的中的INF不是独立的,因为[INF * n]是引用类型,用这种方法创建的列表的每个元素地址相同
[[INF] * n for _ in rang(n)] 中每个元素就是独立的,地址不一样
3.dijkstra算法的思路,dicts列表初始化起点元素的值为0,其他元素为INF,visited列表初始化全部False,找最短的没有visited的最短路径,设置为True,接着找没有visited的点相邻的点,更新dicts列表,直到让所有点的visited都是True,结束循环
4.INF不和其他值比大小,其他值要和INF比较的话,一般用 !=,以x为例,表达式为x != INF