当前位置: 首页 > news >正文

【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. 引入命名空间:
using QuikGraph.Algorithms.Observers;
using QuikGraph.Algorithms.ShortestPath;
using QuikGraph;
  1. 主要测试代码:
        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为起点,到各个顶点的距离):

A-A = 0
A-B = 30
A-D = 52
A-C = 15
A-E = 50

图结构示意(可以人工检查输出结构的正确性):
在这里插入图片描述

相关文章:

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

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…...

查看ubuntu当前路径的剩余存储空间

要查看Ubuntu当前路径所在磁盘分区的剩余存储空间&#xff0c;应该使用df命令&#xff0c;而不是du命令&#xff0c;因为df命令能显示磁盘分区的使用情况&#xff0c;包括总容量、已用空间和可用空间。为了使输出更易于阅读&#xff0c;可以加上-h选项。如果你还想知道特定挂载…...

利用预训练模型和迁移学习打造智能狗门

引言 在深度学习的世界里&#xff0c;预训练模型和迁移学习是两个强大的概念&#xff0c;它们允许我们利用已有的模型和知识来解决新的问题。在本博客中&#xff0c;我们将探索如何使用预训练的模型来创建一个智能狗门&#xff0c;这个系统将能够识别狗并允许它们进入&#xf…...

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …...

基于SpringBoot的竹宣非遗宣传网站

摘要 随着互联网的普及和数字化时代的到来&#xff0c;竹编等非物质文化遗产的保护与传承面临新的机遇和挑战。该研究旨在使用SpringBoot后端框架与Vue前端框架&#xff0c;构建一个竹编非遗宣传网站&#xff0c;通过丰富的展示形式和交互体验&#xff0c;提升公众对竹编这一非…...

怎么清理服务器的C盘?

有时候我们经常会遇到C盘被占满的情况&#xff0c;C盘被占满的原因有很多&#xff0c;下面我们就来分析下有可能导致C盘占满的原因&#xff1a; 第一种情况&#xff1a;中毒 打开服务器任务管理器选择进程&#xff0c;并且勾选显示所有用户的进程&#xff0c;我们可以点击映像…...

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机&#xff1a; 二.买卖股票的最佳时机含冷冻期&#xff1a; 三.买卖股票的最佳时期含⼿续费&#xff1a; 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍&#xff1a;动态规划买卖股票的最佳时机是一个经典的…...

Unity射线检测不到MeshCollider的原因

当我们构建的模型是单面模型时&#xff0c;就会出现射线检测不到MeshCollider的问题&#xff0c;对于渲染&#xff0c;我们可以Cull Off来实现双面渲染&#xff0c;而在射线检测时&#xff0c;Unity提供了一个API来控制是否检测背面&#xff1a;Physics.queriesHitBackfaces 案…...

ssrf初步

一&#xff0c;简介 全称&#xff1a;Server-Side Request Forgery&#xff08;中文&#xff1a;服务器端请求伪造&#xff09; 攻击者从服务端发起请求&#xff0c;让服务器连接任意外部系统&#xff0c;从而泄露敏感数据。主要利用各种协议的请求伪造&#xff0c;例如php协…...

linux 安装 mangodb 并设置服务开机自启

1、下载 wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz 2、解压 tar -zxvf mosquitto-1.6.8.tar.gz 3、编译安装cd mosquitto-1.6.8 make sudo make install4、在当前目录。进入mosquitto服务文件存放的文件夹 cd service/systemd可以看到3个文件 点击read…...

Virtualbox7.0.10+Ubuntu20.04网络配置

虚拟机部署在服务器上时&#xff0c;需要进行网络配置&#xff0c;使虚拟机和服务器在同网段下&#xff0c;以保证内网的终端可以访问到虚拟机 1. 设置虚拟机 打开虚拟机设置&#xff0c;选择“网络”&#xff0c;将网卡设为桥接网卡 注&#xff1a;设置前&#xff0c;需要先…...

设计模式之服务定位器模式

想象一下&#xff0c;你的Java应用是一座庞大的迷宫&#xff0c;里面藏着无数宝贵的服务宝藏&#xff0c;而你正需要一张精确的藏宝图来指引方向&#xff0c;迅速找到并利用这些宝藏。服务定位器模式&#xff0c;正是这样一张神奇的地图&#xff0c;它帮你动态定位并获取应用中…...

冯喜运:5.12黄金回撤继续上涨,下周原油走势分析

【黄金消息面分析】&#xff1a;本周&#xff0c;黄金市场迎来了自4月中旬以来的最佳单周表现。周五&#xff08;3月9日&#xff09;&#xff0c;金价攀升至2360.54美元/盎司&#xff0c;涨幅0.62%&#xff0c;而纽约商品交易所6月交割的黄金期货价格上涨1.5%&#xff0c;收报2…...

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…...

leetcode 2316.统计无向图中无法互相到达点对数

思路&#xff1a;并查集 其实就是连通块的一个变形题目&#xff0c;一般的连通块题目要我们求的是连通个数&#xff0c;或者能不能到达&#xff0c;这里反过来问了。 首先&#xff0c;我们用dfs也是可以做到的&#xff0c;在dfs中统计每一个连通块的个数&#xff0c;然后用乘…...

WPS二次开发系列:如何使用WPS返回的FileUri

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 什么是FileUri 在SDK中的使用场景 打开文档时…...

python删除一个文件夹所有文件

在Python中&#xff0c;可以使用os模块来删除一个文件夹中的所有文件&#xff0c;但保留文件夹本身。以下是一个简单的例子&#xff1a; import osdef delete_files_in_folder(folder_path):for filename in os.listdir(folder_path):file_path os.path.join(folder_path, fi…...

overflow:hidden对解决外边距塌陷的个人理解

外边距塌陷&#xff1a; 子元素的上外边距大于父元素的上外边距&#xff0c;导致边距折叠&#xff0c;取两者之间最大值&#xff0c;即子元素外边距&#xff0c;导致父元素上外边距失效。 解决办法&#xff1a;在父元素样式添加overflow:hidden;或者border:1px solid black;(不…...

【linux软件基础知识】- 文件的概念:Linux 中的文件

Linux 中的文件 在 Linux 中,文件是存储在存储设备(例如硬盘驱动器或固态驱动器)上的数据项的集合。 文件被组织为字节序列,并由文件系统中的唯一名称来标识。 以下是 Linux 中文件的一些关键特征: 字节序列:Linux 中的文件被视为字节序列。 每个字节可以表示一个字符…...

Context capture/Pix4Dmapper/AutoCAD/CASS/EPS软件的安装流程与使用方法;土方量计算;无人机摄影测量数据处理

目录 专题一 无人机摄影测量技术应用现状及其发展 专题二 基本原理和关键技术讲解 专题三 无人机影像外业数据获取 专题四 数据处理环境建立与软件熟悉 专题五 GNSS数据土方量计算 专题六 基于无人机影像数据的正射影像制作 专题七 基于无人机影像数据的三维模型制作 专…...

算法系列之堆排序实践哪家强

1.概念 堆排序是一种树形选择排序&#xff0c;是对简单选择排序的有效改进和优化。 堆(heap)&#xff0c;这里所说的堆是数据结构中的堆&#xff08;对应于算法&#xff09;&#xff0c;而不是内存模型中的堆&#xff08;数据存储形式&#xff0c;还比如&#xff1a;栈&#…...

01-win10安装Qt5

Qt5安装教程 下载Qt5官网下载(下载很慢)镜像网站下载(有些版本没有资源)迅雷下载(推荐)百度网盘下载(推荐)安装Qt5下载Qt5 官网下载(下载很慢) 【注意】:官网下载非常慢,没有镜像下载时常20+ Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这…...

mybatis使用及配置相关,仅做个人记录

在spring-boot项目中mybatis的配置文件在yml文件中&#xff0c;并没有mybatisconfig.xml文件 yml文件中配置&#xff1a;&#xff08;来源&#xff1a;https://blog.51cto.com/u_16213723/8747999&#xff09; mybatis:# XML文件路径&#xff0c;可配置多个&#xff0c;逗号分…...

【STM32 |新建一个工程】基于标准库(库函数)新建工程

目录 STM32开发方式 库函数文件夹 建工程步骤 库函数工程建立 建立工程总结 STM32开发方式 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式&#xff08;库函数的方式&#xff09;、基于HAL库的方式基于库函数的方式是使用ST官方提供的封装好的函数&…...

C#利用ClearScript执行Javascript脚本

1&#xff0c;新建.netframework winform工程 2&#xff0c;打开nuget程序包管理界面&#xff0c;安装Microsoft.ClearScript.V8&#xff0c;Microsoft.ClearScript.V8.Native.win-x64. 3,编写Javascript脚本,另存为demo.js function testFunc(t) {return t "&#xf…...

住宅ip与数据中心ip代理的区别是什么

代理通常意味着“替代”。它是用户设备和目标服务器之间的中介&#xff0c;允许在不同的IP地址下上网。代理ip根据来源分类可分住宅ip与数据中心ip&#xff0c;二者之间区别是什么呢&#xff1f; 住宅ip是由互联网服务提供商(ISP)提供给家庭的IP地址。出于这个原因&#xff0c…...

【计算机网络】数据链路层的功能

数据链路层的基本功能&#xff1a; 封装成帧透明传输差错检测 数据链路层使用的信道主要有两种 点对点信道——PPP协议广播信道——CSMA/CD协议(有线局域网)、CSMA/CA协议(无线局域网) 数据链路层所处的地位 从图中可以看出&#xff0c;数据从主机H1送到主机H2需要在路径中…...

信号线电路串联电阻

简介 两芯片端串联一个电阻&#xff0c;在靠近发送端或接收端。 一般串联的是0Ω, 22Ω, 33Ω的电阻&#xff0c;也可能更大。 目的 1.解决信号反射问题&#xff0c;吸收反射。 问题如下&#xff1a; pcb单端阻抗过大&#xff0c;而接收端是cmos输入&#xff0c;使得接收端…...

手机App防沉迷系统-算法

import java.util.*; public class Main{public static void main(String[] args){Scanner innew Scanner(System.in);int nInteger.parseInt(in.nextLine());//已注册app列表List<Log> listnew ArrayList<>();for(int k0;k<n;k){String[] strin.nextLine().spl…...

day3_prefixSum

一、前缀和技巧 重点 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和 个人理解&#xff1b;预计算&#xff0c;空间换时间 1.(一维数组的前缀和)303区域和检索-数组不可变 获取闭区间值 [left,right] -> preSum[right 1] - preSum[left],其中preSum[right…...