狄克斯特拉 Dijkstra 算法 C#实现

今天在看《算法图解》,看了加权最小路径算法,决定用代码实现一下。

首先是画有向图,在网上找了一下,有不错的开源软件graphviz,该源代码托管在GitLab上。该软件是一个图形可视化软件。
画了一个有向图如下:
图片描述

画图用的代码:

digraph dijkstra{
start->A[label="6"]
start->B[label="2"]
A->end[label="1"]
B->A[label="3"]
B->end[label="5"]
}

我建了一个控制台应用程序:

class Program{public static List<Node> NodeList { get; set; }public static Dictionary<string,int> CostDictionary { get; set; }public static Dictionary<string, string> ParentDictionary { get; set; }public static List<string> CheckedNodeName { get; set; }public Program(){NodeList= new List<Node>{new Node{NodeName = "start",RelatedNode = new Dictionary<string, int>(){{"A", 6},{"B", 2}}},new Node{NodeName = "A",RelatedNode = new Dictionary<string, int>(){{"end", 1}}},new Node{NodeName = "B",RelatedNode = new Dictionary<string, int>(){{"A", 3},{"end", 5}}},new Node{NodeName = "end",RelatedNode = new Dictionary<string, int>()}};CostDictionary = new Dictionary<string,int>(){{"A",6},{"B",2},{"end",int.MaxValue}};ParentDictionary = new Dictionary<string, string>(){{"A","start"},{"B","start"},{"end",""}};CheckedNodeName=new List<string>();}static void Main(string[] args){var progra=new Program();Console.WriteLine($"{"parent",10}|{"node",10}|{"cost",10}");foreach ( var item in NodeList.SelectMany(node=>node.RelatedNode,(node,relatenode)=>new {node.NodeName,relatenode})){Console.WriteLine($"{item.NodeName,10}|{item.relatenode.Key,10}|{item.relatenode.Value,10}");}while (CheckedNodeName.Count!=CostDictionary.Count){//找到Cost最小的节点var currentNode = FindMinCostNode(CostDictionary);//取出relatednode,if (currentNode != null){//循环如果subNode的Cost小于CostDictionary的Costforeach (var subNode in currentNode.RelatedNode){if (subNode.Value < CostDictionary[subNode.Key]){//替换CostDictionary[subNode.Key] = subNode.Value+ CostDictionary[currentNode.NodeName];ParentDictionary[subNode.Key] = currentNode.NodeName;}}CheckedNodeName.Add(currentNode.NodeName);}}Console.WriteLine("最短路径:"+ GetTheMinCostPath());Console.WriteLine("最短路径开销:"+CostDictionary["end"]);Console.ReadKey();}public static string GetTheMinCostPath(){bool isStart=false;string startKey="end";string path= "end=>";while (!isStart){path += ParentDictionary[startKey]+"=>";startKey = ParentDictionary[startKey];if (!ParentDictionary.ContainsKey(ParentDictionary[startKey])){path += ParentDictionary[startKey];isStart = true;}}return path;}public static Node FindMinCostNode(Dictionary<string,int> costDictionary){var costItems= costDictionary.Where(c => !CheckedNodeName.Contains(c.Key)).ToList();if (costItems.Any()){var minCostItem = costItems.OrderBy(c => c.Value).First().Key;return NodeList.FirstOrDefault(n => n.NodeName == minCostItem);}return null;}}public class Node{public string NodeName { get; set; }public Dictionary<string, int> RelatedNode { get; set; }}public class CostItem{public string ParentName { get; set; }public string NodeName { get; set; }public int Cost { get; set; }}

转载于:https://www.cnblogs.com/xxlb/p/9856488.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

So Easy! 让开发人员更轻松的工具和资源

这篇文章给大家分享让开发人员生活更轻松的免费工具和资源。所以&#xff0c;如果你正在寻找一些为迅速解决每天碰到的设计和开发问题的工具和资源&#xff0c;不要再观望&#xff0c;试试这些工具吧。这些奇妙的工具不仅会加快您的生产&#xff0c;也让你的工作质量提升。 您可…

android linux截图库,Android中截图(surfaceView)源码

总结了一个方法&#xff0c;实现了在Android当前Activity的截图&#xff0c;本人测试确实通过了&#xff0c;不过有朋友说截出来的图是黑色的&#xff0c;不能看。我心想&#xff0c;这没有问题啊&#xff0c;相同的代码我就可以执行通过&#xff0c;并没有没有在意这个问题。可…

23套新鲜出炉的网站和手机界面 PSD 素材

Web 用户界面&#xff0c;移动用户界面和线框套件对设计师很有用&#xff0c;因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素&#xff0c;用于它们需要制作的网站或软件模型。 在这篇文章中&#xff0c;我们展示的是自由和…

arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...

《ArcGIS 从基础到实战》书正式出版&#xff0c;易智瑞技术总裁沙志友沙总推荐并亲自写序&#xff0c;京东地址 https://item.jd.com/10025512034581.html第一章 ArcGIS基础和入门 11.1 ArcGIS 10.7 Desktop的安装 11.1.1 安装环境 11.1.2 安装步骤 21.1.3 注意的问…

WebLogic Classloader分析工具

WebLogic Server具有一个名为Classloader Analysis Tool的内置Web应用程序&#xff0c;您可以通过http&#xff1a;// localhost&#xff1a;7001 / wls-cat访问它 您需要使用为/ console Webapp配置的同一用户登录。 使用CAT&#xff0c;您可以检查应用程序在服务器中加载了哪…

Maplace.js – 小巧实用的 jQuery 谷歌地图插件

Maplace.js是一个小的显示谷歌地图的 jQuery 插件&#xff0c;帮助你把谷歌地图嵌入到你的网站&#xff0c;快速在地图位置上创建标记和控制菜单。它需要 jQuery 和谷歌地图 API v3 支持&#xff0c;所以这两个都需要引入到你的页面。它支持标记和自定义图标、缩放级别和自定义…

使用Spring Roo进行概念验证

在Keyhole期间&#xff0c;我参与了许多项目&#xff0c;其中客户要求我们重写旧系统&#xff0c;同时保留其现有数据库。 有时&#xff0c;它有助于快速演示如何使用当前技术来简化开发&#xff0c;测试和维护其代码。 我发现可以创建一个快速示例&#xff08;与当前项目相关…

z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)

[文章导读]我们在组装电脑时&#xff0c;华硕主板可能是大家的首选&#xff0c;最近有网友问&#xff0c;我组装的华硕z490主板电脑怎么装win7系统呢&#xff0c;这里和大家说下&#xff0c;从华硕z490主板后默认是uefigpt引导模式&#xff0c;且官方没有出usb驱动&#xff0c;…

Ember Charts – 基于 Ember D3 的图表库

Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库。它包括时间序列、柱状图、饼图、点图&#xff0c;很容易扩展和修改。这些图表组件代表图表交互性和演示的最佳实践&#xff0c;是高度可定制和可扩展的。您可以添加说明、标签、提示和鼠标悬停效果。 您可能感兴趣的相关文…

值得拥有!精心推荐几款超实用的 CSS 开发工具

当你开发一个网站或 Web 应用程序的时候&#xff0c;有合适的工具&#xff0c;绝对可以帮助您节省大量的时间。在这篇文章中&#xff0c;我为大家收集了超有用的 CSS 开发工具。 对于 Web 开发人员来说&#xff0c;找到有用的 CSS 开发工具&#xff0c;就像找到一个魔灯&#x…

matplotlib散点图笔记

定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import matplotlib.pyplot as plt open,closenp.loadtxt(‘000001.txt’,delimiter’,’,skiprows1,usecols(1,4),unpackTrue…

20款漂亮的长阴影 LOGO 设计作品【附免费生成工具】

长阴影&#xff08;Long Shadow&#xff09;概念来自于最新非常流行的扁平化设计&#xff08;Flat Design&#xff09;。扁平化设计趋势影响最大的是用户界面元素和图标&#xff0c;但它也开始蔓延到其他网页设计的其他部分。 长阴影其实就是扩展了对象的投影&#xff0c;感觉是…

c语言sqlist结构体,c语言里 sqlist

满意答案cielkong2018.08.12采纳率&#xff1a;43% 等级&#xff1a;9已帮助&#xff1a;463人c语言里 sqlist&#xff1f;//定义顺序表L的结构体typedef struct{Elemtype data[MaxSize]&#xff1b;int length;}SqList;//建立顺序表void CreateList(SqList * &L,ElemTy…

汇编语言实验三

1. 练习1 第1步&#xff0c;编写汇编源程序t1.asm, 源程序代码如图1-1所示。 (1) 运行程序&#xff0c;观察程序输出结果是什么&#xff1f; 2) 将 line4和line9种寄存器dl 的值分别修改为 0~9 中任何一个数字&#xff0c;重新汇编→ 连接→运行&#xff0c;观察结果的变化。 …

Java事实让您大吃一惊! (信息图)

随着Java 8计划在未来几天内发布 &#xff0c;我们正在寻找一些Java事实&#xff0c;这些事实将真正捕捉这种编程语言对世界的影响。 因此&#xff0c;我们决定创建一个简单的图表&#xff0c;描述有关Java历史的一些重要统计数据。 信息的主要来源是Oracle的Java时间轴 。 我…

15个创意示例教您如何自定义 404 错误页面

在这篇文章中&#xff0c;你会看到一组充满创意的404错误页面设计。我希望这个集合能够启发和帮助你设计自己的 404 错误页面。一个自定义的404错误页面将鼓励用户在您的网站上停留更长的时间。 404页面必须让访客容易理解&#xff0c;最好有有一些互动。你会看到下面的例子中一…

C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法

本文实例讲述了C实现英文句子中的单词逆序输出的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;#include "stdafx.h"#include #include #include using namespace std;int main(int arc,char** argv){string str"I come from liaoning.";sta…

input 输入值的监听 禁止输入特殊字符

1.input 输入值的监听 //用于监听input的值变化&#xff08;input的值产生变化才会触发事件&#xff09;(function ($) {$.fn.watch function (callback) {return this.each(function () {//缓存以前的值 $.data(this, originVal, $(this).val());//event $(this).on(keyu…

android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)

前言在Android开发中&#xff0c;多线程的使用十分常见今天&#xff0c;我将全面解析多线程其中一种常见用法&#xff1a;继承Thread类。目录示意图1. 简介示意图2. 使用讲解2.1 使用步骤示意图2.2 具体使用// 步骤1&#xff1a;创建线程类 (继承自Thread类)class MyThread ext…

激发你的灵感:16个精美视差效果网页设计作品

对于视差滚动&#xff08;Parallax Scrolling&#xff09;&#xff0c;关注网页设计的朋友都不会陌生。在网页设计中&#xff0c;视差滚动是一种很特别的网页设计技术&#xff0c;通过让多层背景以不同的速度或者不同的方向移动形成 3D 运动效果&#xff0c;有很强的视觉冲击力…