Python实现Dijkstra算法报ValueError及输出到文件问题求解
报错原因
你运行命令的参数依次是脚本名、输入文件名、输出文件名,sys.argv[1]取到的是字符串input.txt,直接转int必然触发类型错误。你原代码的逻辑错误地把命令行参数当成了图的输入数据,实际上图数据存储在输入文件内,需要先读取文件内容才能拿到顶点数和邻接矩阵。
功能实现修正要点
- 先从命令行参数分别获取输入文件路径、输出文件路径
- 读取输入文件内容:第一行转为整数作为顶点数n,后续n行逐行读取转为整数列表作为邻接矩阵
- 实现同时输出到终端和指定文件:自定义打印逻辑,每次输出内容同时打印到终端、写入输出文件
- 原输入中-1代表无边,原代码中
self.graph[x][y] > 0的判断可以正确过滤无边的情况,无需修改。
修正后完整代码
import sys class Graph(): def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] # 新增输出文件对象参数,实现同时输出 def printAnswer(self, dist, src, out_file): for node in range(self.V): if(node != src): res_str = f"node {src} to node {node} : {dist[node]}\n" # 输出到终端 print(res_str.strip()) # 写入输出文件 out_file.write(res_str) def minDistance(self, dist, sptSet): min_val = 1000000009 min_index = -1 for u in range(self.V): if dist[u] < min_val and sptSet[u] == False: min_val = dist[u] min_index = u return min_index def dijkstraMinDist(self, src, out_file): dist = [1000000009] * self.V dist[src] = 0 sptSet = [False] * self.V for cout in range(self.V): x = self.minDistance(dist, sptSet) sptSet[x] = True for y in range(self.V): if self.graph[x][y] > 0 and sptSet[y] == False and \ dist[y] > dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printAnswer(dist, src, out_file) if __name__ == "__main__": # 从命令行获取输入输出文件路径 input_path = sys.argv[1] output_path = sys.argv[2] # 读取输入文件 with open(input_path, 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] # 第一行是顶点数 n = int(lines[0]) # 后续n行是邻接矩阵 g = Graph(n) g.graph = [] for i in range(1, n+1): l = list(map(int, lines[i].split())) g.graph.append(l) # 打开输出文件,执行计算同时输出结果 with open(output_path, 'w', encoding='utf-8') as out_f: for i in range(0, n): g.dijkstraMinDist(i, out_f)
运行方式
直接执行你预期的命令即可:python3 file.py input.txt output.txt
运行完成后终端会打印所有最短路径结果,同时结果会完整写入output.txt文件。
内容的提问来源于stack exchange,提问作者Vokekov
相关产品推荐
相关产品推荐

