【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍

项目地址:https://github.com/KeRNeLith/QuikGraph

QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。

QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径,最大流量、最小生成树等算法。

QuikGraph最初由Jonathan "Peli" de Halleux于2003年创建,并命名为QuickGraph。随后更新为YC.QuickGraph。

这个版本的QuickGraph,改名为QuikGraph,是YC.QuickGraph的一个分支。我尝试使用现代C#开发(.NET Core)清理该库,将其作为一个干净的NuGet包提供。该计划旨在全面清理、修复原始库及其所有非核心部件的问题,并对其进行改进。

示例

  1. 创建一个.Net Framework4.7.2框架的项目。
  2. 在NuGet上搜索QuikGraph,并安装。
  3. 引入命名空间:
csharp 复制代码
using QuikGraph.Algorithms.Observers;
using QuikGraph.Algorithms.ShortestPath;
using QuikGraph;
  1. 主要测试代码:
csharp 复制代码
        public void DijkstraSimpleGraph()
        {
            // 创建邻接图,使用string类型作为顶点、边的唯一标识
            var graph = new AdjacencyGraph<string, Edge<string>>(true);

            // 添加顶点到图中
            graph.AddVertex("A");
            graph.AddVertex("B");
            graph.AddVertex("D");
            graph.AddVertex("C");
            graph.AddVertex("E");

            // 创建边
            var a_b = new Edge<string>("A", "B");
            var a_c = new Edge<string>("A", "C");
            var b_c = new Edge<string>("B", "C");
            var b_e = new Edge<string>("B", "E");
            var c_d = new Edge<string>("C", "D");
            var d_e = new Edge<string>("D", "E");
            var e_d = new Edge<string>("E", "D");
             
            // 添加边到图中
            graph.AddEdge(a_b);
            graph.AddEdge(a_c);
            graph.AddEdge(b_c);
            graph.AddEdge(c_d);
            graph.AddEdge(d_e);
            graph.AddEdge(b_e);
            graph.AddEdge(e_d);

            // 定义边的权重
            var weight = new Dictionary<Edge<string>, double>(graph.EdgeCount)
            {
                [a_b] = 30,
                [a_c] = 15,
                [b_c] = 10,
                [b_e] = 20,
                [c_d] = 40,
                [d_e] = 4,
                [e_d] = 2,
            };

            // 创建算法,传入图和权重
            var algorithm = new DijkstraShortestPathAlgorithm<string, Edge<string>>(graph, e => weight[e]);

            // Attach a Vertex Predecessor Recorder Observer to give us the paths
            // 使用顶点前置记录器,以提供路径计算
            var predecessorObserver = new VertexPredecessorRecorderObserver<string, Edge<string>>();
            using (predecessorObserver.Attach(algorithm))
                //以顶点A为起点,运行算法
                algorithm.Compute("A");

            //打印A为起点,到各个点的距离
            foreach (var vertex in graph.Vertices)
            {
                Trace.WriteLine($"A-{vertex} = {algorithm.GetDistance(vertex)}");
            }
          
        }

打印输出结果(打印了A为起点,到各个顶点的距离):

bash 复制代码
A-A = 0
A-B = 30
A-D = 52
A-C = 15
A-E = 50

图结构示意(可以人工检查输出结构的正确性):

相关推荐
汪小白JIY2 小时前
【C#】异步和多线程
c#·thread·async·task·threapool
宝桥南山4 小时前
DeepSeek - 尝试一下GitHub Models中的DeepSeek
microsoft·ai·微软·c#·github·.net
lljss202010 小时前
C# 一个解决方案放一个dll项目,一个dll测试项目 ,调试dll项目的源码
c#
ghost14319 小时前
C#学习第27天:时间和日期的处理
开发语言·学习·c#
jason成都19 小时前
c#压缩与解压缩-SharpCompress
开发语言·c#
傻啦嘿哟20 小时前
从零开始:用Tkinter打造你的第一个Python桌面应用
开发语言·c#
CodeCraft Studio21 小时前
PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
前端·pdf·c#
InCerry21 小时前
.NET周刊【5月第4期 2025-05-25】
c#·.net·.net周刊
阿蒙Amon1 天前
C#获取磁盘容量:代码实现与应用场景解析
开发语言·c#
界面开发小八哥1 天前
VS代码生成工具ReSharper v2025.1——支持.NET 10和C# 14预览功能
开发语言·ide·c#·.net·visual studio·resharper