dijkstra算法学习

dijkstra算法学习

一、最短路径

单源最短路径:计算源点到其他各顶点的最短路径的长度

全局最短路径:图中任意两点的最短路径

Dijkstra、Bellman-Ford、SPFA求单源最短路径

Floyed可以求全局最短路径,但是效率比较低

SPFA算法是Bellman-Ford算法的队列优化

Dijkstra算法不能求带负权边的最短路径,而SPFA算法、Bellman-Ford算法、Floyd-Warshall可以求带负权边的最短路径。

Bellman-Ford算法的核心代码只有4行,Floyd-Warshall算法的核心代码只有5行。

深度优先遍历可以求一个点到另一个点的最短路径的长度

二、dijkstra算法图解

三、算法步骤

1.初始化,选择好初始点,设总共有vexnum个节点,则总共要将vexnum-1个节点放入s中

for(i = 1;i<G.vexnum;i++)

2.遍历U,找出其中最短路径的点,并作记录(放入S中)

    // 遍历G.vexnum-1次;每次找出一个顶点的最短路径。for (i = 1; i < G.vexnum; i++){// 寻找当前最小的路径;// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 标记"顶点k"为已经获取到最短路径flag[k] = 1;

3.更新剩余U中节点的距离:设步骤2中加入的节点为k,最短距离为min,则if(k的邻居到k的距离+min)<dist(D,k的邻居),则更新dist(D,k的邻居)

        // 修正当前最短路径和前驱顶点// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp  < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}

四、完整代码

/** Dijkstra最短路径。* 即,统计图(G)中"顶点vs"到其它各个顶点的最短路径。** 参数说明:*        G -- 图*       vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。*     prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。*     dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。*/
void dijkstra(Graph G, int vs, int prev[], int dist[])
{int i,j,k;int min;int tmp;int flag[MAX];      // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。// 初始化for (i = 0; i < G.vexnum; i++){flag[i] = 0;              // 顶点i的最短路径还没获取到。prev[i] = 0;              // 顶点i的前驱顶点为0。dist[i] = G.matrix[vs][i];// 顶点i的最短路径为"顶点vs"到"顶点i"的权。
    }// 对"顶点vs"自身进行初始化flag[vs] = 1;dist[vs] = 0;// 遍历G.vexnum-1次;每次找出一个顶点的最短路径。for (i = 1; i < G.vexnum; i++){// 寻找当前最小的路径;// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 标记"顶点k"为已经获取到最短路径flag[k] = 1;// 修正当前最短路径和前驱顶点// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp  < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}// 打印dijkstra最短路径的结果printf("dijkstra(%c): \n", G.vexs[vs]);for (i = 0; i < G.vexnum; i++)printf("  shortest(%c, %c)=%d\n", G.vexs[vs], G.vexs[i], dist[i]);
}

参考资料:http://www.cnblogs.com/skywang12345/p/3711512.html

 

转载于:https://www.cnblogs.com/nathan2young/p/9196590.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

+++程序员高手修炼之路

正在做Andy Hunt和David Thomas的《程序员修炼之路》英文注释版&#xff08;The Pragmatic Programmer&#xff09;的最后审稿工作。 这本书虽然很早就读过一些&#xff0c;但现在再读&#xff0c;仍然暗暗称奇。作者一定是在长期工作中养成了记笔记的习惯&#xff0c;才能写出…

MATLAB字符转数据

fstr2num(0.00682329)fstr2double(s)

计算机专业必须读的经典书籍

一、 科学哲学和管理哲学 【1】 “程序开发心理学”&#xff08;The Psychology of Computer Programming &#xff1a; Silver Anniversary Edition&#xff09;【2】 “系统化思维导论”&#xff08;An Introduction to Systems Thinking&#xff0c; Silver Anniversary Edi…

php定时任务(自己)

php定时任务&#xff08;自己&#xff09; 一、总结 一句话总结&#xff1a;可用php.exe连接php文件和bat文件&#xff0c;bat文件在计划任务中可以设置定时执行&#xff0c; 二、 1、php 2、bat E: "D:\software\code\phpStudy2018\PHPTutorial\php\php-5.4.45\php.exe&q…

使用Java查询DynamoDB项

在上一篇文章中&#xff0c;我们继续在DynamoDB数据库上插入数据。 在本教程中&#xff0c;我们将对DynamoDB表发出一些基本查询。 主要规则是每个查询都必须使用哈希键。 查询的最简单形式是仅使用哈希键。 我们将在此表上查询Users表。 结果只有一个&#xff0c;因此在迭代…

Excel日期格式在matlab中的转换

Excel支持的日期格式如下&#xff1a;2011*8*12&#xff0c;*可以为“年”、“/”、“—”等形式&#xff0c;然而使用xlsread函数后肯定会转为字符串格式&#xff0c;不便于管理&#xff0c;下面是将日期改为8位如“20110812”这样的格式的步骤&#xff1a; 1. 在excel中通过…

数据库Mysql的学习(六)-子查询和多表操作

UPDATE readerinfo SET balance balance-(SELECT price FROM bookinfo WHERE book_id20150301)*0.05 WHERE card_id 20121xxxxxx; //子查询就是一个嵌套先计算子查询SELECT * FROM borrow WHERE book_id (SELECT book_id FROM bookinfo book_name xxxxxx)SELECT * FROM bookin…

有关算法方面的经典书籍推荐

如果计算机系只开三门课&#xff0c;那么这三门课就一定是&#xff1a;离散数学&#xff0c;数据结构与算法&#xff0c;编译原理。如果只开一门课&#xff0c;那剩下的就一定是&#xff1a;数据结构与算法。Niklaus Wirth说&#xff1a;算法&#xff0b;数据结构&#xff1d;程…

idea资源包下创建资源包_资源包技巧和最佳实践

idea资源包下创建资源包今天是资源捆绑日。 通常&#xff0c;这是Java中最著名的国际化机制&#xff08;i18n&#xff09;。 使用它应该很容易。 但是&#xff0c;弄污双手时会出现许多小问题。 如果您有相同的想法&#xff0c;则此文章适合您。 基本 java.util.ResourceBundl…

MATLAB字符串输出

print();%最基本的字符串输出error();%主要用于报错

将JINQ与JPA和H2一起使用

几天前&#xff0c;我读了Iu Ming-Yee关于JINQ的有趣采访 。 顾名思义&#xff0c;JINQ是一种尝试提供类似于LINQ for Java的尝试。 基本思想是缩小在关系数据模型上执行查询的面向对象代码之间的语义鸿沟。 关系数据库模型的查询应轻松集成到代码中&#xff0c;以使其感觉更自…

蓝桥杯 2011年第二届C语言初赛试题(1)

轮换 串“abcd”每个字符都向右移位&#xff0c;最右的移动到第一个字符的位置&#xff0c;就变为“dabc”。这称为对串进行位移1的轮换。同理&#xff0c;“abcd”变为&#xff1a;“cdab”则称为位移2的轮换。 下面的代码实现了对串s进行位移为n的轮换。请补全缺失的代码。…

MATLAB读写mat文件

1. 保存mat文件&#xff1a;save %将工作区间中所有的变量都储存为MATLAB.mat文件中save filename %将工作区间中所有的变量都储存为filename.mat文件中save filename x1 x2 x3 ⋯⋯ xn %将工作区间中变量名位 x1 x2 x3 ⋯⋯ xn的变量都储存在filen…

奇偶换行颜色变化

<!DOCTYPE html><html> <head> <meta name"viewport" content"widthdevice-width"> <title>js</title> <style type"text/css"> td{ border: 1px solid red; } /* * 方法一 * tr:nth-child(odd):hove…

楼天城 楼教主

楼天城 求助编辑百科名片 楼天城楼天城是杭州人&#xff0c;姚期智教授的得意门生&#xff0c;正是姚教授发现他的才能后把他引上了现在的研究方向&#xff0c;并大力举荐他参加国际学术会议和比赛。在网络上他被称为“楼教主”&#xff0c;清华同学则简称他“教主”。中文名&a…

MATLAB读写Excel数据

读&#xff1a;[num,txt] xlsread(FileName.xls,n,basic);%num保存的是数据矩阵&#xff0c;txt保存的是文本矩阵&#xff0c;n是标签数从1开始计数,basic是区间&#xff0c;如A1:B3写&#xff1a;xlswrite(filename.xls,num,n,range);%:文件名&#xff0c;变量名&#xff0c;…

很多文章是在下转载贴在此处,是为了自己以后遇到类似问题一时想不起来

有转载有原创,更多是为了记录一些解决方案,,毕竟好记性不如烂笔头.转载于:https://www.cnblogs.com/wuchenV/p/9209356.html

jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法

jpa 与非jpa 结合今天&#xff0c;我们将看到有关此工具的信息&#xff0c;该工具使使用JPA Criteria更加容易。 使用该库的应用程序将在JPA实现中更加简洁&#xff0c;易于使用和可移植。 在本文的结尾&#xff0c;您将找到要下载的源代码。 什么是标准&#xff1f; 当前是创…

在c++中qsort()排序函数的使用qsort函数应用大全

七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序&#xff08;同in…

Python排序算法之快速排序

转自&#xff1a;https://www.cnblogs.com/AlwinXu/p/5424905.html 快速排序&#xff08;quickSort&#xff09; 快排的思想&#xff1a;首先任意选取一个数据&#xff08;通常选用数组的第一个数&#xff09;作为关键数据&#xff0c;然后将所有比它小的数都放到它前面&#x…