示例无向图如下:(起始点为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. Luogu-3705 [SDOI2017]新生舞会

    分数规划,最大费用最大流 题意可以简化为给出一个矩阵,要求每行和每列必须且只能取一个格子,要求\(sigma\ a_{i,j}/sigma\ b_{i,j}\) 最大 考虑分数规划,可以将式子转化: ...

  2. castle windsor学习-----How components are created

  3. POJ 2831 Can We Build This One:次小生成树【N^2预处理】

    题目链接:http://poj.org/problem?id=2831 题意: 给你一个图,每条边有边权. 然后有q组询问(i,x),问你如果将第i条边的边权改为x,这条边是否有可能在新的最小生成树中 ...

  4. unit Base64Unit;

    unit Base64Unit; unit Base64Unit; //Download by http://www.codefans.net interface uses Classes, SysU ...

  5. 处理json的工具类({本类为处理json的工具类})

    <jackson.version>2.2.3</jackson.version> <!-- json --> <dependency> <grou ...

  6. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  7. Mybatis_笔记_01_逆向工程

    通过Mybatis逆向工程,可以从数据库中的表自动生成pojo.mapper映射文件和mapper接口 此处暂存怎么使用逆向工程,原理以后再探讨 工程结构 要修改的地方:generatorConfig ...

  8. PHP 写入缓存

    1.创建file.PHP <?php class File{ //封装方法 private $_dir; const EXT='.text';//文件后缀,定义为常量 public functi ...

  9. rabbitmq-交换机

    四种交换机: direct fanout topic headers http://www.jianshu.com/p/469f4608ce5d

  10. codeforces 655B B. Mischievous Mess Makers(贪心)

    题目链接: B. Mischievous Mess Makers time limit per test 1 second memory limit per test 256 megabytes in ...