单源最短路径算法(Dijkstra算法)

【算法】单源最短路径算法——Dijkstra算法 Dijkstra算法 阅读详情
1、图形相关类(前面有个,但这里增加了一些属性)
 /// <summary>
    /// 图类,由节点和边构成.
    /// </summary>
    public class Graphic
    {
        /// <summary>
        /// 用于图形访问临时公共变量
        /// </summary>
        public int FinishOrder { get; set; }
        /// <summary>
        /// 用于图形访问临时公共变量
        /// </summary>
        public int EnterOrder { get; set; }

        public List<Node> Nodes { get; set; }
        public List<Edge> Edges { get; set; }
        public Graphic()
        {
            Nodes = new List<Node>();
            Edges = new List<Edge>();
        }
        public void Add(Node Node)
        {
            if (this.Nodes.IndexOf(Node) < 0)
            {
                this.Nodes.Add(Node);
            }
        }
        public void Add(Edge Edge)
        {
            if (this.Edges.IndexOf(Edge) < 0)
            {
                this.Edges.Add(Edge);
            }

        }
        public void ResetTempAdjNodes()
        {
            foreach (var theNode in this.Nodes)
            {
                theNode.ResetTempAdjNodes();
            }
        }
    }
    /// <summary>
    /// 树类,包括节点和边构成
    /// </summary>
    public class Tree
    {
        public List<Node> Nodes { get; set; }
        public List<Edge> Edges { get; set; }
        public Tree()
        {
            Nodes = new List<Node>();
            Edges = new List<Edge>();
        }
        public void Add(Node Node)
        {
            if (this.Nodes.IndexOf(Node) < 0)
            {
                this.Nodes.Add(Node);
            }
        }
        public void Add(Edge Edge)
        {
            if (this.Edges.IndexOf(Edge) < 0)
            {
                this.Edges.Add(Edge);
            }

        }
    }

    /// <summary>
    /// 节点类
    /// </summary>
    public class Node
    {
        public string Symbol { get; set; }
        public Node Parent { get; set; }
        /// <summary>
        /// 用于算法临时存放,一般为key值.
        /// </summary>
        public double TempVal { get; set; }
        public int VisitedSign { get; set; }
        /// <summary>
        /// 用于算法临时存放
        /// </summary>
        public Edge TempEdge { get; set; }
        /// <summary>
        /// 邻接节点
        /// </summary>
        public Dictionary<Node, Edge> AdjNodes;
        /// <summary>
        /// 临时邻接节点,用于计算中补破坏原图结构.
        /// </summary>
        public Dictionary<Node, Edge> TempAdjNodes;
        public Node(string Symbol)
        {
            this.Symbol = Symbol;
            AdjNodes = new Dictionary<Node, Edge>();
            TempAdjNodes = new Dictionary<Node, Edge>();
        }
        /// <summary>
        /// 同步临时邻接节点集合值.
        /// </summary>
        public void ResetTempAdjNodes()
        {
            TempAdjNodes.Clear();
            foreach (var theDictItem in AdjNodes)
            {
                TempAdjNodes.Add(theDictItem.Key, theDictItem.Value);
                theDictItem.Value.ResetTempWeight();
            }
        }
        /// <summary>
        /// 用于深度搜索标记
        /// </summary>
        public int EnterTime { get; set; }
        /// <summary>
        /// 用于深度搜索标记
        /// </summary>
        public int FinishTime { get; set; }

        public int FinishOrder { get; set; }
        public int EnterOrder { get; set; }
    }
    /// <summary>
    /// 边类,包括两个节点和权重.
    /// </summary>
    public class Edge
    {
        public Node Node1 { get; set; }
        public Node Node2 { get; set; }
        public double Weight { get; set; }
        public double TempWeight { get; set; }
        public int EdgeType { get; set; }
        public Edge(Node N1, Node N2, double Weight)
        {
            this.Node1 = N1;
            this.Node2 = N2;
            this.Weight = Weight;
        }
        public void ResetTempWeight()
        {
            this.TempWeight = this.Weight;
            
        }
    }
2、单源路径基本操作
 public class SingleSourcePath
    {
        /// <summary>
        /// 单源路径中初始化图的计算设置值
        /// </summary>
        /// <param name="g">要初始化的图</param>
        public void InitializeGraphic(Graphic g,Node s)
        {
            //Node节点的TempVal属性存放最小路径估计值,Parent属性存放其父节点.
            foreach (var theNode in g.Nodes)
            {
                theNode.TempVal = double.MaxValue;
                theNode.Parent = null;
            }
            s.Parent = null;
            s.TempVal = 0;
        }
        /// <summary>
        /// 单源路径中初始化图的计算设置值(矩阵表示法)
        /// </summary>
        /// <param name="Parents"></param>
        /// <param name="Distance"></param>
        /// <param name="n"></param>
        /// <param name="s"></param>
        public void InitializeGraphic(int[] Parents, double[] Distance,int n,int s)
        {
            for (int i = 0; i < n; i++)
            {
                Parents[i] = -1;
                Distance[i] = double.PositiveInfinity;
            }
            Distance[s] = 0;
        }
        /// <summary>
        /// 松弛技术
        /// </summary>
        /// <param name="GraphicMatrix">图邻接矩阵</param>
        /// <param name="Parents">顶点父节点</param>
        /// <param name="Distance">源点到其它节点的距离</param>
        /// <param name="u">顶点</param>
        /// <param name="v">顶点</param>
        public void Relax(double[,] GraphicMatrix,int[] Parents,double[] Distance,int u,int v)
        {
            if (double.IsPositiveInfinity(Distance[u])==true)
            {
                return;
            }
            if (Distance[v] > Distance[u] + GraphicMatrix[u,v])
            {
                Distance[v] = Distance[u] + GraphicMatrix[u, v];
                Parents[v] = u;
            }
        }
        /// <summary>
        /// 松弛边Edge的两个节点node1,node2.
        /// </summary>
        /// <param name="node1"></param>
        /// <param name="node2"></param>
        /// <param name="weight"></param>
        public void Relax(Edge edge)
        {
            if (edge.Node1.TempVal == double.MaxValue)
            {
                return;
            }
            if (edge.Node2.TempVal > edge.Node1.TempVal + edge.Weight)
            {
                edge.Node2.TempVal = edge.Node1.TempVal + edge.Weight;
                edge.Node2.Parent = edge.Node1;
            }
        }
    }
3、Dijkstra算法
public class KruskalAlg
    {
        public  Tree MST_Kruskal(Graphic g)
        {
            //为每个顶点建立一颗树,仅包含一个顶点,做初始化
            List<Tree> theTrees = new List<Tree>();
            foreach (var theNode in g.Nodes)
            {
                Tree theTree_Tmp = new Tree();
                theTree_Tmp.Add(theNode);
                theTrees.Add(theTree_Tmp);
            }
            //对边进行排序
            var theEdgesQuery = from e in g.Edges
                               orderby e.Weight
                               select e;
            var theSortEdges = theEdgesQuery.ToArray();
            //刚开始最小生成树为空.
            Tree theMST = new Tree();
            //没有采用foreach,以保证访问按排序进行.
            for(int i=0;i<theSortEdges.Count();i++) 
            {
                var theEdge = theSortEdges[i];
                //找theEdge边的两个点各自所在的树.
                Tree theTree1 = FindTreeByNode(theEdge.Node1, theTrees);
                Tree theTree2 = FindTreeByNode(theEdge.Node2, theTrees);
                //如果theEdge边的两个点各自所在的树不相同,则将该边选入最小生成树,
                //同时需要将两个树进行合并。
                if (theTree1 != theTree2)
                {
                    theMST.Edges.Add(theEdge);
                    theMST.Nodes.Add(theEdge.Node1);
                    theMST.Nodes.Add(theEdge.Node2);
                    UnionTreeInForest(theTree1, theTree2, theEdge, theTrees);
                }
            }
            return theMST;
        }
        /// <summary>
        /// 在森林中寻找某个节点所在的树
        /// </summary>
        /// <param name="Node">要找的节点</param>
        /// <param name="Forest">森林</param>
        /// <returns></returns>
        private  Tree FindTreeByNode(Node Node, List<Tree> Forest)
        {
            foreach (var theTree in Forest)
            {
                foreach (var theNode in theTree.Nodes)
                {
                    if (theNode.Symbol == Node.Symbol)
                    {
                        return theTree;
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// 在这个算法中,边是可以不用合并进来的.
        /// </summary>
        /// <param name="Tree1"></param>
        /// <param name="Tree2"></param>
        /// <param name="Edge"></param>
        /// <param name="Forest"></param>
        private  void UnionTreeInForest(Tree Tree1, Tree Tree2, Edge Edge, List<Tree> Forest)
        {
            Tree1.Nodes.AddRange(Tree2.Nodes);
            Tree1.Edges.AddRange(Tree2.Edges);
            Tree1.Edges.Add(Edge);
            Forest.Remove(Tree2);
        }
    }

Dijkstra算法的思路其实很朴实,就是如果两棵树的一条割边是所有连接这两棵树的割边中最小的边,那么这条边一定在这两棵树组成的图形中跨树最短路径中。通过不断的合并树最终形成一棵完整的最短路径树。当然,合并的法则是按边权从小到大进行。

 
数据结构:单源最短路径--Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离。指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题。 Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法。该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点。 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合。假设V0是源点,则初始 S={V0}。 阅读详情

相关推荐

【算法】单源最短路径——dijkstra算法

一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。 dijkstra算法简介 迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 需要注意的是,dij

Reimia的博客 3万+

单源最短路径 dijkstra算法思路+代码实现

单源最短路径dijkstra模板 代码+解释

DaoCaoRen___的博客 1610

Dijkstra算法一种用于求解单源最短路径问题的经典算法

Dijkstra算法是解决单源最短路径问题的经典算法,由Edsger W. Dijkstra于1956年提出。它采用贪心策略,逐步扩展已知最短路径集合,适用于非负权重的加权图。算法通过初始化距离数组、优先队列和已处理顶点集合,迭代更新邻接顶点的最短距离。时间复杂度取决于优先队列的实现方式:从O(V²)到O(E+VlogV)。需要注意的是,该算法不能处理负权边。示例展示了从源点A到其他顶点的最短路径计算过程,并附有Python实现代码,使用优先队列优化效率。

qq_39777550的博客 1431

【迪杰斯特拉算法】单源最短路径(C语言实现)

迪杰斯特拉算法 迪杰斯特拉算法(Dijkstra)是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 C语言代码实现如下: //【贪心算法】单源最短路径问题 #include <stdio.h> #include <stdlib.h> #define N 5 // 5个顶点,1、2、3、4、5 #define M 9999 /.

qq_54623898的博客 3105

Dijkstra算法|单源最短路径|贪心算法

单愿最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源(origin)。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是到达路径各边权值之和。       Dijkstra算法是解单源最短路径问题的贪心算法。Dijkstra算法的基本思想是:设置顶点集合S并不断地做贪心选择来扩充集合。一个顶点属于集合S当且仅当从源点到该顶点

Andrew Shaw|失的猛 4147

单源最短路径问题Dijkstra算法的c语言实现

       求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值是依照图赋的,邻接节点赋对应边的权值,其他节点赋无穷大)。在Dijkstra算法的每一个阶段,将未处理的节点放入一个集合S,扫描S中距离最小的一个节点v,将v置为处理状态。然后在剩下的所...

qq_41951186的博客 9344

单源最短路径——Dijkstra代码实现

单源最短路 Dijkstra算法 从起点到其他顶点的最短距离 边权非负

青春无问西东 岁月自成芳华 2292

算法——单源最短路径:Bellman-Ford算法、Dijkstra算法

前言 在最短路径问题中,约定

关注校招求职,微信号:job_campus 3282

单源最短路径算法的实现-----迪杰斯特拉(Dijkstra)算法【C/C++】

单源最短路径算法的实现-----迪杰斯特拉(Dijkstra)算法

bblb的博客 2021

SPM12最新安装教程:Matlab2021a用户必看的路径配置技巧

本文为Matlab2021a用户提供SPM12的深度安装与路径配置指南。针对新版Matlab的路径管理变化,详细解析了传统方法失效的原因,并推荐通过创建startup.m文件实现SPM12路径的永久化、自动化配置,确保神经影像分析环境的稳定与高效。

weixin_29061509的博客 315

华为云Stack交付实战:从工勘到上线的全流程拆解

本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。

weixin_29243063的博客 156

Dijkstra单源最短路径算法

这里写目录标题一、算法原理二、MATLAB实现三、参考文献 一、算法原理 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 以下图为例,首先介绍Dijstra的原理。 红字为各结点的编号,黑字为各结点之间的距离。 首先定义几个变量: 结点个数nnn

心升明月的博客 2587

论文理解【LLM-Agent】——【SkillOpt】Executive Strategy for Self-Evolving Agent Skills

SkillOpt 将 agent skill 从人工或一次性 prompt artifact 转化为可验证、可控、可迁移的文本空间“可训练状态”,通过有界编辑、验证门控、拒绝编辑反馈和 slow/meta update,在不更新模型权重的情况下显著提升多类 agent 任务表现

佚失的诗篇 594

单源最短路径-Dijkstra算法

写在前面:好久没看图论了,今天写作业的时候发现我已经忘记了。俗话说的好,好记性不如烂笔头,我翻了翻之前的笔记,竟然没有关于Dijkstra的(手动狗头)。赶紧连夜写了一篇博客,只为勾引我对Dijkstra的些许记忆。 单源最短路径-Dijkstra算法 从一个顶点到其余各顶点的最短路径算法,解决的是有权图(不存在负权边)中最短路径问题 1.算法思想 它是由E.W.Dijkstra提出的一种按照路径长度递增的次序分别产生到各顶点最短路径的贪心算法。     &nbs.

Huberyxiao的博客 1193

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 460

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1860

Dijkstra 算法求单源最短路径—— Java 实现

package com.algorithm.greed; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; /** * @author zhoushixiong * @Description Dijkstra 算法求单源最短路径 * @date 2020/11/18 8:58 **/ public c.

mengyanyuan8023的博客 477

ANPC三电平拓扑双脉冲试验的原理与实施

ANPC三电平拓扑因损耗低、谐波小、应力均衡而广泛应用,但其存在短、长两类换流通道,寄生电感和开关应力差异显著。短通道尖峰小、可靠性高;长通道应力严苛。因此需分别制定两套独立双脉冲测试方案,针对不同时段和器件(如T1、T5、T6、T4及对应二极管)全面考核开关特性。

嵌入式老牛的博客 351

dijkstra复杂度_Dijkstra算法详细(单源最短路径算法)

介绍对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。Dijkstra能是干啥的?Dijkstra是用来求单源最短路径的就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra ...

weixin_42360467的博客 579

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 548

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式。通过这种方式,我们可以同时展示两个变量的趋势,并在时序数据末尾添加数值标签,使得数据更加直观和易于理解。假设我们有一个包含两个变量的时间序列数据集,一个是时间变量,另一个是对应的数值变量。现在,我们可以使用ggplot2包来创建一个基本的时间序列图,其中包含两个数值变量。接下来,我们将添加一个双Y轴,并在时序数据末尾添加数值标签。函数在数值1的每个数据点上添加数值标签。

Orion_O的博客 270

【算法】Dijkstra 算法:解决单源最短路径问题

Dijkstra 算法Dijkstra算法,中文名音译作迪杰斯特拉算法或戴克斯特拉算法,它是一个用来解决赋权图的单源最短路径问题的算法。之所以这个算法名这么不好读也不好记,是因为 Dij...

YeJuliaLi的博客 3716

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

dijkstra算法_Dijkstra算法详细(单源最短路径算法)

介绍对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。Dijkstra能是干啥的?Dijkstra是用来求单源最短路径的就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra ...

weixin_39664998的博客 246

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

单源最短路径问题:Dijkstra算法

主要是Dijkstra算法简介,简单介绍一下贪心算法、单源最短路径问题、加权有向图、邻接列表

mmd666的博客 1299

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

带权有向图单源最短路径(Dijkstra算法)

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。 假设P(i,j)={Vi.

arhaiyun的专栏 1万+

JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

一,概念单源最短路径给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。dijkstra算法简介迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心...

weixin_28878311的博客 1861
上一篇: R语言学习(概念理解2)
下一篇: 单源最短路径算法(BellmanFord算法)
广州接入
广州接入 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄24年 2224粉丝 731原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值