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

C# 路径算法之Dijkstra算法

Dijkstra算法是一种用于在图中找到从单个源节点到其他所有节点的最短路径的算法。它适用于带有非负权重的图。在C#中实现Dijkstra算法,我们可以使用优先队列(如SortedDictionarySortedSet与自定义比较器,或者使用.NET的PriorityQueue类,如果你使用的是较新版本的.NET)来优化性能。但为了简化说明,这里我将使用一个简单的List和一个MinHeap的模拟来实现它。

然而,为了保持示例的清晰和简洁,我将使用一个基于Listfor循环的简化版本,尽管这不是最高效的实现。

以下是Dijkstra算法的一个C#实现示例:

using System;
using System.Collections.Generic;
using System.Linq;class Graph
{private Dictionary<int, List<Edge>> adjList;public Graph(int numVertices){adjList = new Dictionary<int, List<Edge>>(numVertices);for (int i = 0; i < numVertices; i++){adjList[i] = new List<Edge>();}}public void AddEdge(int src, int dest, int weight){adjList[src].Add(new Edge(dest, weight));}public Dictionary<int, int> Dijkstra(int src){int numVertices = adjList.Count;var dist = new Dictionary<int, int>(numVertices);var visited = new HashSet<int>();// 初始化距离数组,所有距离为无穷大,除了源节点为0foreach (var vertex in adjList.Keys){dist[vertex] = int.MaxValue;}dist[src] = 0;// 找到最短路径for (int count = 0; count < numVertices - 1; count++){// 选择最小距离的未访问节点int u = GetMinDistanceVertex(dist, visited);// 标记节点为已访问visited.Add(u);// 更新相邻节点的距离foreach (var neighbor in adjList[u]){int v = neighbor.Dest;int weight = neighbor.Weight;if (!visited.Contains(v) && dist[u] != int.MaxValue && dist[u] + weight < dist[v]){dist[v] = dist[u] + weight;}}}return dist;}// 辅助函数,用于从未访问的节点中找到距离最小的节点private int GetMinDistanceVertex(Dictionary<int, int> dist, HashSet<int> visited){int min = int.MaxValue;int minIndex = -1;foreach (var vertex in dist.Keys){if (!visited.Contains(vertex) && dist[vertex] <= min){min = dist[vertex];minIndex = vertex;}}return minIndex;}// 边的结构体struct Edge{public int Dest;public int Weight;public Edge(int dest, int weight){Dest = dest;Weight = weight;}}
}class Program
{static void Main(string[] args){Graph g = new Graph(5);g.AddEdge(0, 1, 10);g.AddEdge(0, 2, 6);g.AddEdge(0, 3, 5);g.AddEdge(1, 3, 15);g.AddEdge(2, 3, 4);var distances = g.Dijkstra(0);foreach (var kvp in distances){Console.WriteLine($"Distance from 0 to {kvp.Key} is {kvp.Value}");}}
}

在这个实现中,我们创建了一个Graph类,其中包含了一个邻接表来存储图,以及添加边和执行Dijkstra算法的方法。Dijkstra方法返回一个字典,其中包含从源节点到图中每个节点的最短距离。

为了简化示例,GetMinDistanceVertex函数通过遍历所有节点来找到未访问节点中具有最小距离的节点,这在大图中可能效率不高。在实际应用中,应该使用优先队列(如PriorityQueue或自定义的最小堆)来优化这一过程。


http://www.mrgr.cn/news/33986.html

相关文章:

  • 医疗医药随货清单打印软件下载 佳易王药品批发出库单打印管理系统操作教程
  • 【幸运数 / A】
  • react中解析markdown文本
  • 机器学习与深度学习的区别:深入理解与应用场景
  • 控糖新食尚,糖尿病患者的美味与健康同行!
  • 【MYSQL】聚合查询、分组查询、联合查询
  • 【OSS安全最佳实践】对OSS内身份证图片中身份证号进行脱敏
  • 了解你的GPU:深入探讨AMD SMI
  • 教师管理系统小程序+ssm论文源码调试讲解
  • MyBatis-Plus 实体类注解
  • 网站建设中,sitemap是什么,有什么作用
  • 如何撰写出色的API接口文档:提升开发效率与用户体验
  • 爷爷不泡茶武汉头一杯,东方茶港主题店盛大开业!
  • Pandas-日期类型处理代码详解
  • SQLServer运维实用的几个脚本
  • 【题解】—— LeetCode一周小结38
  • ICM20948 DMP代码详解(38)
  • 【功能详解】IoTDB 与 ThingsBoard 成功集成!
  • NASA:ASTER L1A 重建未处理仪器数据 V003
  • Easy Excel从入门到精通!!!