You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:48:04