示例无向图如下:(起始点为v0)

邻接矩阵为:

注意:其中没有连接的边和自己到自己的点权值用10000表示。

代码:

static void Main(string[] args)
{
  int[,] graph = new int[,] { { , , , , , }, { , , , , , }, { , , , , , }, { , , , , , }, { , , , , , }, { , , , , , } };
  int n = 6;
  int[] S = new int[n]; //最短路径的顶点集合   string[] mid = new string[n];//点的路线
  for (int i = ; i < n; i++)
  {
    S[i] = ;
    mid[i] = "";
  }
  ShortestPathByDijkstra(n, graph, S, mid);
} public static int IsContain(int m,int[] S)//判断该顶点是否已经计算过
{
  int index = -;
  for (int i = ; i < ; i++)
  {
    if (S[i] == m)
    {
    index = i;
    }
  }
  return index;
} /// <summary>
/// Dijkstrah实现最短路算法
/// </summary>
static void ShortestPathByDijkstra(int n,int[,] graph, int[] S, string[] mid)
{
  int min;
  int next;   for (int f = n-; f > ; f--)
  {
    //置为初始值
    min = ;
    next = ;//第一行最小的元素所在的列 next点
    //找出第一行最小的列值
    for (int j = ; j < n; j++)//循环第0行的列
    {
      if ((IsContain(j,S) == -) && (graph[, j] < min))//不在S中,找出第一行最小的元素所在的列
      {
        min = graph[, j];
        next = j;
      }
    }
    //将下一个点加入S
    S[next] = next;
    if (min == )
    {
      Console.WriteLine("V0到V{0}的最短路径为:无", next);
    }
    else
    {
      Console.WriteLine("V0到V{0}的最短路径为:{1},路径为:V0{2}->V{0}", next, min, mid[next]);
    }
    // 重新初始0行所有列值
    for (int j = ; j < n; j++)//循环第0行的列
    {
      if (IsContain(j,S) == -)//初始化除包含在S中的
      {
        if ((graph[next, j] + min) < graph[, j])//如果小于原来的值就替换
  {
          graph[, j] = graph[next, j] + min;
          mid[j] = mid[next] + "->V" + next;//记录过程点
        }
      }
    }
  }
}

结果

  

解析:

  分三部分,主函数中给出图中的初始邻接矩阵,顶点个数。以及初始化最短路径的顶点集合和点路线集合。

  IsContain(int m,int[] S)这个函数是在每次循环的时候判断该点是否已经在最短路径集合中,即已经遍历过。

  接下来就是Dijkstra算法,大致步骤如下:

    1、添加初始顶点v0在集合S中,遍历第一行,找最小的权值所在的顶点列值j。

    2、将j值做为下一个点加入集合S中,输出此时到达j点的最小路径。

    3、重新初始化第一行的值,通过判断加入某点后graph[next][j]+min是否小于graph[0, j](其中j不在集合S中),若是则替换后者,并记录此过程 mid[j] = mid[next] + "->V" + next;

    4、循环1、2、3步骤顶点数-1次。

  

详细参考:https://blog.csdn.net/qq_25954259/article/details/78289335?locationNum=5&fps=1

Dijkstra 路径规划 C#的更多相关文章

  1. 全局路径规划算法Dijkstra(迪杰斯特拉算法)- matlab

    参考博客链接:https://www.cnblogs.com/kex1n/p/4178782.html Dijkstra是常用的全局路径规划算法,其本质上是一个最短路径寻优算法.算法的详细介绍参考上述 ...

  2. 机器人路径规划其一 Dijkstra Algorithm【附动态图源码】

    首先要说明的是,机器人路径规划与轨迹规划属于两个不同的概念,一般而言,轨迹规划针对的对象为机器人末端坐标系或者某个关节的位置速度加速度在时域的规划,常用的方法为多项式样条插值,梯形轨迹等等,而路径规划 ...

  3. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  4. 基于谷歌地图的Dijkstra算法水路路径规划

    最终效果图如下: 还是图.邻接表,可以模拟出几个对象=>节点.边.路径.三个类分别如下: Node 节点: using System; using System.Collections.Gene ...

  5. ROS探索总结(十四)——move_base(路径规划)

    在上一篇的博客中,我们一起学习了ROS定位于导航的总体框架,这一篇我们主要研究其中最重要的move_base包. 在总体框架图中可以看到,move_base提供了ROS导航的配置.运行.交互接口,它主 ...

  6. 游戏AI之路径规划(3)

    目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...

  7. move_base的全局路径规划代码研究

    algorithmn parameter code 主要是以下三个函数 计算所有的可行点 怎么计算一个点的可行点 从可行点中计算路径path todo algorithmn 算法的解释 Dijkstr ...

  8. ROS源码解读(二)--全局路径规划

    博客转载自:https://blog.csdn.net/xmy306538517/article/details/79032324 ROS中,机器人全局路径规划默认使用的是navfn包 ,move_b ...

  9. ROS机器人路径规划介绍--全局规划

    ROS机器人路径规划算法主要包括2个部分:1)全局路径规划算法:2)局部路径规划算法: 一.全局路径规划 global planner ROS 的navigation官方功能包提供了三种全局路径规划器 ...

随机推荐

  1. Java 使用itext生成pdf以及下载

    使用方法: 1.需要两个jar包: iText-5.0.6.jar    //必须使用该版本,否则缺少相关的方法 TextAsian.jar //是为了文档中正常显示中文所必须引用的包 TextAsi ...

  2. python实现Deque

    1 Deque定义 deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变.deque 不同的地方是添加和删除项是非限制性的.可以在前面或后面添加新项 ...

  3. ACM学习历程—HDU 5023 A Corrupt Mayor's Performance Art(广州赛区网赛)(线段树)

    Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sel ...

  4. Erlang generic standard behaviours -- gen_server terminate

    gen_server 主体 module 已经分析完了(http://www.cnblogs.com/--00/p/4271982.html),接着,分析下gen_server 中的terminate ...

  5. Hibernate Validator--创建自己的约束规则

    尽管Bean Validation API定义了一大堆标准的约束条件, 但是肯定还是有这些约束不能满足我们需求的时候, 在这种情况下, 你可以根据你的特定的校验需求来创建自己的约束条件. 3.1. 创 ...

  6. Java数组的基本讲解

    由于Java数组涵盖的内容比较多,这里从个人的角度对主要的内容进行相关的讲解. 如有不足,欢迎批评指正~ 1)Java数组是动态还是静态的啊?     Java语言是典型的静态语言,由此推断Java数 ...

  7. IPC编程之消息队列

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面3类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3.共享内存(匿名的和具名的) ...

  8. Spinner 通过XML形式绑定数据时 无法从String.xml中读取数组

    在android应用程序中,通过XML形式给Spinner绑定数据,如果把数组放在系统的string.xml文件里,那么就有可能在运行时无法找到,导致程序异常结束,解决方法是自建一个XML文件来存放数 ...

  9. [51nod1058]求N!的长度

    法1:stirling公式近似 $n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$ (如果怕n不够大下式不成立,可以当数小于10000时用for求阶层) 也可以 ...

  10. Wannafly 锁

    题意: 现在有 $n$ 个人,每个人有一个已然给定的重要度 $a_i$,现有 K 个锁,每个锁有若干钥匙,分配给一些人,要求一群人能够打开全部 $K$ 把锁, 当且仅当他们重要度的和大于等于 $m$, ...