为Floyd Warshall算法制作距离矩阵"最短路径" (https://www.cs.usfca.edu/~galles/visualization/Floyd.html?hc_location=ufi),你需要一些道路作为顶点和这些道路之间的距离作为边缘。例如(出发地,目的地,距离):roads = [["Philadelphia", "New York City", 120 ], ["New York City", "Philadelphia", 97 ],[ "Millburn, "New York City", 25 ],["Morristown", "Harrisburg", 150]
如何在python中创建这个矩阵?
这是结构:
network[0] = #list destinations
for i in range (len(roads)):
network [i][0] = #list departures
我不知道如何在正确的位置填充距离,因为network[roads[i][0],[roads[i][1]]
在目的地或离境的使用次数超过一次时不是正确的解决方案。
非常感谢!
答案 0 :(得分:1)
如果您有N个城市,则需要尺寸为N x N的矩阵。
首先,你必须将城市映射到数字。
'Millburn' : 0
'Morristown': 1
...
计算城市数量 - N并制作尺寸为N x N的空矩阵。现在将矩阵(i,j)的每个条目设置为城市i和j之间的距离。如果没有直接连接设置值为无穷大。
一旦你有了这个矩阵,就在它上面运行FLoyd Warshall算法。
答案 1 :(得分:0)
如果您正在寻找快速查找,您可以考虑dict
而不是列表列表(需要额外空间的权衡)
distance = {'Millburn': {'New York': 25}),
'Morristown': {'Harrisburg': 150}),
'New York City': {'Philadelphia': 97}),
'Philadelphia': {'New York City': 120})}
(注意插入反向边和值)
你可以使用defaultdict
从你给出的数组中创建一个类似上面的词典。
from collections import defaultdict
roads = [["Philadelphia", "New York City", 120 ], ["New York City", "Philadelphia", 97 ],[ "Millburn", "New York", 25 ],["Morristown", "Harrisburg", 150]]
d = defaultdict(lambda : defaultdict(lambda:0))
for source,dest,distance in roads:
d[source][dest] = distance
如果您使用pandas,则可以将上述字典转换为pandas数据帧。
import pandas
dist = pandas.DataFrame.from_dict(distance)
print dist
# Millburn Morristown New York City Philadelphia
#Harrisburg NaN 150 NaN NaN
#New York 25 NaN NaN NaN
#New York City NaN NaN NaN 120
#Philadelphia NaN NaN 97 NaN
dist['Philadelphia']['New York City']
# 120.0