前言

迪杰斯特拉算法 是求最短路径方法的其中一种,这个有什么作用呢?

有一张图:

假设求G点到其他各点的最小路径。

是这样来的。

比如找到了和G点相连接所有点,ABED。这时候确定GA是一定是最短的,为什么这么说呢?G->A和G从别的点到A,一旦G走BED 一定会大于GA,后续就跟不可能大于了。

所以GA为最短,这时候就确定了A。这时候开始从A点开始,找到和A点相连但是没有确定最短的点,有B、C。G->A->B 大于G->B。然后A可以到C,这时候确定G->C 是9。

然后从G到各点已经相连中,找到没有确认的最小路径,这个就是确认了G->B最短。为什么能够确认呢?因为G到A然后到B大于G->B,那么可以确认G到B最短,这是因为GA是最短的,从最短的到不了,其他的一定大于G->B。

上面说其实有点模糊。

是这样的,如果从G为出发点确认了n个点,那么剩下的m个点怎么确认呢?

肯定就是从G从到先到G最短的点,尝试是否有其他路,如果没有,那么就确认了。

正文

代码如下:

class Program
{
private static int INF = int.MaxValue; static void Main(string[] args)
{
char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
int N = 65535;// 表示不可以连接
int[,] matrix = { { N, 5, 7, N, N, N, 2 },
{ 5, N, N, 9, N, N, 3 },
{ 7, N, N, N, 8, N, N },
{ N, 9, N, N, N, 4, N },
{ N, N, 8, N, N, 5, 4 },
{ N, N, N, 4, 5, N, 6 },
{ 2, 3, N, N, 4, 6, N }
};
//创建 Graph对象
Graph graph = new Graph(vertex, matrix);
//测试, 看看图的邻接矩阵是否ok
graph.showGraph();
//测试迪杰斯特拉算法
graph.dsj(2);//C
graph.showDijkstra();
Console.Read();
}
}
class Graph
{
private char[] vertex;//顶点数组
private int[,] matrix;//邻接矩阵
private VisitedVertex vv;//顶点状态
public Graph(char[] vertex, int[,] matrix)
{
this.vertex = vertex;
this.matrix = matrix;
} public void showDijkstra()
{
vv.show();
} public void showGraph()
{
for (int i = 0; i < vertex.Length; i++)
{
for (int j = 0; j < vertex.Length; j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
} public void dsj(int index)
{
vv = new VisitedVertex(vertex.Length, index);
update(index);
for (int i = 1; i < vertex.Length; i++)
{
index = vv.updateArr();
update(index);
}
} private void update(int index)
{
int len = 0;
for (int j = 0; j < vertex.Length; j++)
{
len = vv.getDis(index) + matrix[index, j];
if (!vv.isVisited(j) && len < vv.getDis(j))
{
vv.updatePre(j, index);
vv.updateDis(j, len);
}
}
}
}
class VisitedVertex
{ //记录各个顶点的访问状态
public int[] already_arr;
//每个顶点对应前一个顶点的下标
public int[] pre_visited;
//记录出发点到其他顶点的距离
public int[] dis; public VisitedVertex(int length, int index)
{
already_arr = new int[length];
pre_visited = new int[length];
dis = new int[length];
Array.Fill(dis, int.MaxValue);
this.already_arr[index] = 1;
this.dis[index] = 0;
} public int updateArr()
{
int min = int.MaxValue, index = 0;
for (int i = 0; i < already_arr.Length; i++)
{
if (already_arr[i] == 0 && dis[i] < min)
{
min = dis[i];
index = i;
}
}
//更新 index 顶点被访问过
already_arr[index] = 1;
return index;
}
/// <summary>
/// 是否访问过
/// </summary>
/// <param name="index">下标距离</param>
/// <returns></returns>
public Boolean isVisited(int index)
{
return already_arr[index] == 1;
}
//更新距离
public void updateDis(int index, int length)
{
dis[index] = length;
} //更新前驱节点
public void updatePre(int index, int pre)
{
pre_visited[index] = pre;
}
//返回到某个节点的距离
public int getDis(int index)
{
return dis[index];
}
//显示最后的结果
//即将三个数组的情况输出
public void show()
{
Console.WriteLine("输出前驱");
//输出pre_visited
foreach (int i in pre_visited)
{
Console.Write(i + " ");
}
Console.WriteLine();
char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
int count = 0;
foreach (int i in dis)
{
if (i != 65535)
{
Console.Write(vertex[count] + "(" + i + ") ");
}
else
{
Console.Write("N ");
}
count++;
}
Console.WriteLine();
}
}

结果:

重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]的更多相关文章

  1. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  2. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

  3. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  4. [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

    在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...

  5. 数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)

    今天做的最多的事情就是纠错了,通过添加输出语句判断错误来源: 找到错误来源: wb = new XSSFWorkbook(input);//语句创建错误 网上查询发现是jar包的问题: 下图为poi的 ...

  6. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  7. 迪杰斯特拉算法c语言实现

    /*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法  P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2  ...

  8. 最短路问题:迪杰斯特拉算法(Dijsktra)

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  9. 最短路径之迪杰斯特拉算法的Java实现

    Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...

  10. 数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

    数据结构图之三(最短路径--迪杰斯特拉算法)   [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两 ...

随机推荐

  1. C++ //谓词 //一元谓词 //概念:返回bool类型的仿函数称为 谓词 //如果 operator()接受一个参数,那么叫做一元谓词 //如果 operator()接受 2 个参数,那么叫做一元谓词

    1 //谓词 2 //一元谓词 3 //概念:返回bool类型的仿函数称为 谓词 4 //如果 operator()接受一个参数,那么叫做一元谓词 5 //如果 operator()接受 2 个参数, ...

  2. 如何获取拼多多推流码并使用OBS进行直播-疯狂URL

    简介 拼多多直播在PC端可以用多多视频|多多直播端进行开播,它的功能类似于常见的抖音直播助手和快手直播伴侣等等客户端.此教程测试时间 2023-7-12,第三方随时可能会升级,无法保证时效,建议不要升 ...

  3. 解密prompt系列26. 人类思考vs模型思考:抽象和发散思维

    在Chain of Thought出来后,出现过许多的优化方案例如Tree of thought, Graph of Thought, Algorithm of Thought等等,不过这些优化的出发 ...

  4. esp8266 I2C 实例解析及源码分析

    一  前言 作为一个方案商兼芯片开发者,研究芯片和功能实现除了基本的工作需要,还有一层就是也变成了一种职业习惯.从芯片到方案,发现很多方案公司的人水平都比较堪忧,只会调用api,根本不会看底层的代码实 ...

  5. epoll和ractor的粗浅理解

    我们继续上篇的文章继续更新我们的代码. 首先就是介绍一下epoll的三个函数. epoll_create epoll_ctl epoll_wait 如何去理解这3个函数,我是这样去理解这个函数, 就像 ...

  6. Oss流程分析

    最新式上传方案是:前端上传获取token,然后token中带有bucket.账号.回调地址等相关信息,前端直接上传到阿里云,阿里云上传成功后回调之前设定好的地址,完成上传.(下图是技术负责人的图,盗来 ...

  7. 修改easyui日期控件只显示年月,并且只能选择年月

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 一个简单的RTMP服务器实现 --- RTMP复杂握手(Complex Handshake)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. 修复华硕笔记本fn+f2在ubuntu下wifi不能够正常使用和WiFi Disabled (Hard-blocked) (译文)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2014-12-22 11:49:16 ...