示例无向图如下:(起始点为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强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  2. Spark- 流量日志分析

    日志生成 package zx.Utils import java.io.{File, FileWriter} import java.util.Calendar import org.apache. ...

  3. 分享知识快乐自己:Layui 常用样式

    下载 样式包  Layui  layer 引入 js 及 样式: <link rel="stylesheet" href="${ctx}/static/layui/ ...

  4. ES doc_values介绍2——本质是field value的列存储,做聚合分析用,ES默认开启,会占用存储空间

    一.doc_values介绍 doc values是一个我们再三重复的重要话题了,你是否意识到一些东西呢? 搜索时,我们需要一个“词”到“文档”列表的映射 排序时,我们需要一个“文档”到“词“列表的映 ...

  5. Python--基础文件读写操作

    1,open(),对文件进行读写操作之前,要先打开文件,获取文件的句柄: 懒人专用方法,文件打开后不用关闭 with open(r'somefile.txt','r+',encoding='utf8' ...

  6. HihoCoder 1636

    /** * 题目链接:https://cn.vjudge.net/problem/HihoCoder-1636 * 题目意思,石子合并,每次可以合并相邻的石子.每次可以x堆合并为一堆. * x属于[l ...

  7. hdu-5650 so easy(水题)

    题目链接: so easy Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others)Tota ...

  8. IE input 去掉文本框的叉叉和密码输入框的眼睛图标

    ::-ms-clear, ::-ms-reveal{display: none;}

  9. Arc073_F Many Moves

    传送门 题目大意 有$n$个格子从左到右依次挨着,一开始有两枚棋子分布在$A,B$某一个或两个格子里,有$m$个操作,第$i$次操作要求你把其中一个棋子移到$X_i$上,移动一个棋子的代价是两个格子之 ...

  10. Linux CentOS 6.5 64位 静默安装Oracle11g 云主机

    本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...