前言

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

有一张图:

假设求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. MySql学习之初识SQLyog

    •SQLyog安装与配置 [安装包,提取码:w6sj] [安装教程,提取码:cwqu] •MySQL的语法规范 不区分大小写,但建议关键字大写,表名.列名小写 每条命令最好用分号结尾 每条命令根据需要 ...

  2. XAF Blazor FilterPanel 布局样式

    从上一篇关于ListView布局样式的文章中,我们知道XAFBlazor是移动优先的,如果想在PC端有更好的用户体验,我们需要对布局样式进行修改.这篇介绍在之前文章中提到的FilterPanel,它的 ...

  3. Python-使用openpyxl读取excel内容

    1. 本篇文章目标 将下面的excel中的寄存器表单读入并构建一个字典 2. openpyxl的各种基本使用方法 2.1 打开工作簿 wb = openpyxl.load_workbook('test ...

  4. vscode 自定义 当前行转大写快捷键 alt + shift + U

    vscode 自定义 当前行转大写快捷键 alt + shift + U

  5. SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开)

    SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开) 火狐55以后支持

  6. obs 录制教程 手机录屏用 向日葵 手机投屏 能用有线用有线的连接

    obs 录制教程 手机录屏用 向日葵 手机投屏 稍微有点卡 华为手机有个投屏 笔记本不支持这个 miracast 淘宝有卖 投屏设备的,搜 miracast 100多米 免费的就用向日葵就得了. 最新 ...

  7. iMindMap 10 的使用体验 + 讯飞输入法 + windows防火墙 (完美)

    这个软件 最终的效果非常好. 但是有一个硬bug,就是输入光标 搜狗输入法和百度输入法,输入法获取不到,导致输入中文的时候,文字候选框位置特别远. 如果是纯英文 输入使用,就没有这个bug. 总结: ...

  8. labeImg 遇到闪退问题,TypeError: setValue(self, a0: int): argument 1 has unexpected type 'float'

    将python 环境安装为python3.9,然后重新安装labelImg

  9. AI 学习时代:大语言模型领域的行业黑话和专业术语解析

    近年来,深度学习技术的快速发展带动了大语言模型在自然语言处理领域的广泛应用.在这个激动人心的领域里,我们常常会遇到一些行业黑话和专业术语.为了帮助大家更好地入门,让我们深入探讨一些关键概念,以及它们在 ...

  10. 低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现

    上一篇文章,我们分析并设计了关于构建引擎BuildEngine的切面设计.本文我们将基于BuildEngine所提供的切面处理能力,在CustomCreateElementHandle中通过一些逻辑, ...