python-3.x - Dijkstra最短路径Python3中的打印路径
问题描述
我在下面的代码中遇到问题,它没有显示每个顶点的任何路径。与源的顶点和距离显示正确,但输出的路径部分为空白。我错过了什么?我很想得到一些反馈或建议,甚至回答这个噩梦。我似乎无法弄清楚是什么导致路径显示任何内容。我对 Python 还是很陌生,我真的可以使用一些帮助!
class Graph:
def minDistance(self, dist, queue):
# Initialize min value and min_index as -1
minimum = float("Inf")
min_index = -1
# from the dist array,pick one which
# has min value and is till in queue
for i in range(len(dist)):
if dist[i] < minimum and i in queue:
minimum = dist[i]
min_index = i
return min_index
def printPath(self, parent, j):
# Base Case : If j is source
if parent[j] == -1:
print()
j,
return
self.printPath(parent, parent[j])
print()
j,
def printSolution(self, dist, parent):
src = 0
print("Vertex \t\tDistance from Source\tPath")
for i in range(1, len(dist)):
print(("\n%d --> %d \t\t%d \t\t\t\t\t" % (src, i, dist[i])), end=' ')
self.printPath(parent, i)
def dijkstra(self, graph, src):
row = len(graph)
col = len(graph[0])
dist = [float("Inf")] * row
parent = [-1] * row
dist[src] = 0
queue = []
for i in range(row):
queue.append(i)
while queue:
u = self.minDistance(dist, queue)
queue.remove(u)
for i in range(col):
if graph[u][i] and i in queue:
if dist[u] + graph[u][i] < dist[i]:
dist[i] = dist[u] + graph[u][i]
parent[i] = u
self.printSolution(dist, parent)
g = Graph()
graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],
[4, 0, 8, 0, 0, 0, 0, 11, 0],
[0, 8, 0, 7, 0, 4, 0, 0, 2],
[0, 0, 7, 0, 9, 14, 0, 0, 0],
[0, 0, 0, 9, 0, 10, 0, 0, 0],
[0, 0, 4, 14, 10, 0, 2, 0, 0],
[0, 0, 0, 0, 0, 2, 0, 1, 6],
[8, 11, 0, 0, 0, 0, 1, 0, 7],
[0, 0, 2, 0, 0, 0, 6, 7, 0]
]
g.dijkstra(graph, 0)
解决方案
您的代码的基本问题是该printPath
方法仅输出空白,其次,该printSolution
方法不包括该printPath
方法的结果。要解决这些问题: 1 重写 printPath 函数,如下所示:
def printPath(self, parent, j, l):
# Returns a list from destination to source
# Base case when j = source
if parent[j] == -1:
return l
else:
l.append(j)
return self.printPath(parent, parent[j], l)
然后重写printSolution
方法如下:
注意:我使用f格式结构来简化我的打印语句
def printSolution(self, dist, parent):
src = 0
print("Vertex \t\tDistance from Source\tPath")
for i in range(1, len(dist)):
st = f"\n{src} --> {i}\t\t{dist[i]}\t\t\t\t\t{self.printPath(parent,i,[])[::-1]}"
#print(("\n%d --> %d \t\t%d \t\t\t\t\t" % (src, i, dist[i])), end=' ')
#self.printPath(parent, i)
print (st)
推荐阅读
- c# - 将缺失的日期添加到没有销售的 JSON
- linux-kernel - 元数据日志如何停止写入系统调用?
- matplotlib - Matplotlib:设置animation.rc参数
- python - 如何将模板字段与forms.py和views.py连接起来,以便在模板字段中传递的值可以通过函数
- emacs - emacs 独立并排拆分窗口
- python - Selenium:无法调用单击按钮元素
- java - 请检查 JNDI 领域配置
- c - 简单c程序中的奇怪输出值
- lua - ROBLOX - 如果语句不会在 while 循环内运行?
- java - 在 JAVA 中使用 char '{' 定义字符串