Dijkstra python 库将值传递给 Graph 中的 add_edge

Dijkstra python library passing value to the add_edge in Graph

我正在尝试使用 Python 中的内置 Dijkstar 库并查询传递 add_edge 值。请帮忙。

from dijkstar import find_path, Graph
graph = Graph()

input_file = input('Input the file name')
w = list()
i = 0
with open(input_file, 'r') as file:
    for line in file:
        for word in line.split():
            w.append(word)
        graph.add_edge(w[0], w[1], w[2])
        print(w[0], w[1], w[2])
        i = 0
        w.clear()

print(find_path(graph, 1, 4))

输入文件如下,它对 w[0]、w[1] 和 w[2] 工作正常

1 2 1000
2 3 2000
3 4 3000
1 4 4000

输出显示如下错误:

raise NoPathError('Could not find a path from {0} to {1}'.format(s, d))
dijkstar.algorithm.NoPathError: Could not find a path from 1 to 4

路径1到4有两种方式,那为什么会显示错误,没看懂。 如果我能得到任何帮助,那就太好了。

相信问题是你没有将输入转换为数字(即权重仍然是字符串)。

尝试以下方法。

代码

from dijkstar import find_path, Graph

input_file = input('Input the file name: ')

with open(input_file, 'r') as file:
    graph = Graph()                     # place closer to where first used
    for line in file:
      line = line.rstrip()              # remove trailing '\n'
      w = list(map(int, line.split()))  # convert line to list of ints
      graph.add_edge(w[0], w[1], w[2])  # add edge with weights
      print(w[0], w[1], w[2])

print(find_path(graph, 1, 4))

输入

file.txt

1 2 1000 
2 3 2000 
3 4 3000 
1 4 4000

输出

PathInfo(nodes=[1, 4], edges=[4000], costs=[4000], total
_cost=4000)

评论

无需将 w 声明为列表或在使用之间清除它

w = list()  # no need
w.clear()   # no need

在遍历文件时,几乎总是应该去掉尾随的 '\n'

 line = line.rstrip()

这是一种在 w

中放置元素的低效方式
for word in line.split():
    w.append(word)

直接赋值更简单

 w = line.split()

然而,w 将填充字符串,因此需要映射到整数。

 w = list(map(int, line.split()))

变量 i 未使用(或不需要),因此删除。

i = 0