C#中从文本文件读取矩阵以实现Dijkstra算法的问题
解决从文本文件读取矩阵实现Dijkstra算法的问题
我懂你现在的困扰——原来硬编码的邻接矩阵改从文本文件读取怎么都搞不定,别着急,我来帮你把代码调整好,完美实现从文件读取矩阵的功能。
修改后的完整C#代码
using System; using System.IO; class DijkstraAlgorithm { private static int MinimumDistance(int[] distance, bool[] shortestPathTreeSet, int verticesCount) { int min = int.MaxValue; int minIndex = 0; for (int v = 0; v < verticesCount; ++v) { if (shortestPathTreeSet[v] == false && distance[v] <= min) { min = distance[v]; minIndex = v; } } return minIndex; } private static void Print(int[] distance, int verticesCount) { Console.WriteLine("Vertex Distance from source"); for (int i = 0; i < verticesCount; ++i) Console.WriteLine("{0}\t {1}", i, distance[i]); } public static void DijkstraAlgo(int[,] graph, int source, int verticesCount) { int[] distance = new int[verticesCount]; bool[] shortestPathTreeSet = new bool[verticesCount]; for (int i = 0; i < verticesCount; ++i) { distance[i] = int.MaxValue; shortestPathTreeSet[i] = false; } distance[source] = 0; for (int count = 0; count < verticesCount - 1; ++count) { int u = MinimumDistance(distance, shortestPathTreeSet, verticesCount); shortestPathTreeSet[u] = true; for (int v = 0; v < verticesCount; ++v) if (!shortestPathTreeSet[v] && Convert.ToBoolean(graph[u, v]) && distance[u] != int.MaxValue && distance[u] + graph[u, v] < distance[v]) distance[v] = distance[u] + graph[u, v]; } Print(distance, verticesCount); } // 新增方法:从文本文件读取邻接矩阵 private static int[,] ReadGraphFromFile(string filePath) { // 读取文件所有行 string[] lines = File.ReadAllLines(filePath); int rowCount = lines.Length; // 分割第一行获取列数 string[] firstRowElements = lines[0].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int colCount = firstRowElements.Length; // 创建二维数组 int[,] graph = new int[rowCount, colCount]; // 逐行填充矩阵 for (int i = 0; i < rowCount; i++) { string[] elements = lines[i].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < colCount; j++) { graph[i, j] = int.Parse(elements[j]); } } return graph; } static void Main(string[] args) { // 替换成你的文本文件路径,比如 @"C:\graph.txt" 或者直接用文件名(放在程序输出目录) string filePath = "graph.txt"; int[,] graph = ReadGraphFromFile(filePath); // 顶点数直接从矩阵行数获取,不用硬编码 int verticesCount = graph.GetLength(0); // 调用Dijkstra算法,源点设为0 DijkstraAlgo(graph, 0, verticesCount); } }
关键修改点说明
- 新增
ReadGraphFromFile方法:这个方法负责读取文本文件内容并转换成二维数组:- 用
File.ReadAllLines读取文件的每一行; - 通过第一行的元素数量确定矩阵的列数,行数就是文件的行数;
- 逐行分割元素(用空格分割,同时忽略空元素避免格式问题),转换成整数后填充到二维数组中。
- 用
- Main方法调整:去掉了硬编码的矩阵,换成调用
ReadGraphFromFile方法读取文件,顶点数直接从矩阵的GetLength(0)获取,不用手动写死,更灵活。 - 兼容性:原有的Dijkstra算法核心逻辑完全保留,只是数据源从硬编码改成了文件读取,不影响算法的功能。
测试注意事项
- 把你提供的矩阵内容保存成文本文件,命名为
graph.txt; - 如果文件不在程序的输出目录,记得在
filePath里写完整的绝对路径(比如@"D:\Projects\Dijkstra\graph.txt"); - 确保文件里的每一行元素数量一致,都是10个(对应你提供的10x10矩阵),元素之间用空格分隔。
内容的提问来源于stack exchange,提问作者alberto cruz
相关产品推荐
相关产品推荐

