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

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方法:这个方法负责读取文本文件内容并转换成二维数组:
    1. 用File.ReadAllLines读取文件的每一行;
    2. 通过第一行的元素数量确定矩阵的列数,行数就是文件的行数;
    3. 逐行分割元素(用空格分割,同时忽略空元素避免格式问题),转换成整数后填充到二维数组中。
  • Main方法调整:去掉了硬编码的矩阵,换成调用ReadGraphFromFile方法读取文件,顶点数直接从矩阵的GetLength(0)获取,不用手动写死,更灵活。
  • 兼容性:原有的Dijkstra算法核心逻辑完全保留,只是数据源从硬编码改成了文件读取,不影响算法的功能。

测试注意事项

  1. 把你提供的矩阵内容保存成文本文件,命名为graph.txt;
  2. 如果文件不在程序的输出目录,记得在filePath里写完整的绝对路径(比如@"D:\Projects\Dijkstra\graph.txt");
  3. 确保文件里的每一行元素数量一致,都是10个(对应你提供的10x10矩阵),元素之间用空格分隔。

内容的提问来源于stack exchange,提问作者alberto cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:06