修改Python版Dijkstra算法为从命令行读写输入输出文本文件
邻接矩阵版Dijkstra算法命令行适配方案
修改说明
- 引入Python标准库
sys读取命令行参数,无需手动交互输入数据 - 输入数据从命令行指定的txt文件读取,输出结果直接写入指定的txt文件
- 保留原Dijkstra算法核心逻辑不变,仅调整输入输出链路
完整代码
import sys def dijkstra(adj, n, source=0): # 初始化距离数组,初始值为无穷大 dist = [float('inf')] * n dist[source] = 0 visited = [False] * n for _ in range(n): # 找到未访问节点中距离最小的节点 min_dist = float('inf') u = -1 for i in range(n): if not visited[i] and dist[i] < min_dist: min_dist = dist[i] u = i if u == -1: break # 剩余节点均不可达 visited[u] = True # 更新邻接节点的最短距离 for v in range(n): if not visited[v] and adj[u][v] != float('inf') and dist[v] > dist[u] + adj[u][v]: dist[v] = dist[u] + adj[u][v] return dist if __name__ == "__main__": # 校验命令行参数数量 if len(sys.argv) != 3: print("使用方法错误,正确格式:python3 file.py 输入文件路径 输出文件路径") sys.exit(1) input_path = sys.argv[1] output_path = sys.argv[2] # 读取输入文件 adj_matrix = [] with open(input_path, 'r', encoding='utf-8') as f: n = int(f.readline().strip()) for _ in range(n): # 输入中9999代表不可达,自动转换为无穷大 row = list(map(lambda x: float('inf') if int(x) == 9999 else int(x), f.readline().strip().split())) adj_matrix.append(row) # 计算最短路径 result = dijkstra(adj_matrix, n) # 写入输出文件 with open(output_path, 'w', encoding='utf-8') as f: for idx, distance in enumerate(result): if distance == float('inf'): f.write(f"顶点0到顶点{idx}的最短路径:不可达\n") else: f.write(f"顶点0到顶点{idx}的最短路径长度:{distance}\n")
使用说明
- 按照要求准备输入txt文件:第一行为顶点数
n,后续n行每行有n个空格分隔的整数,不可达的边权重填9999即可 - 执行命令:
python3 file.py input.txt output.txt - 计算完成后结果会直接写入指定的输出txt文件中
示例
输入文件input.txt内容示例:
4 0 2 9999 5 9999 0 3 9999 9999 9999 0 1 9999 9999 9999 0
输出文件output.txt内容示例:
顶点0到顶点0的最短路径长度:0 顶点0到顶点1的最短路径长度:2 顶点0到顶点2的最短路径长度:5 顶点0到顶点3的最短路径长度:4
内容的提问来源于stack exchange,提问作者Vokekov
相关产品推荐
相关产品推荐

