单源最短路径-迪杰斯拉特算法
思路:
在网络中,从某个顶点Vx出发到达另外一个顶点Vi,往往有多条路径,其中,边的权值之和最小的路径称为最短路径,并称Vx为这条最短路径的源点,Vi为终点。
显然,边最少的路径不一定是最短路径。
求网络中从指定源点到其余各顶点的最短路径的问题,通常称为单源最短路径问题。
迪杰斯拉特方法:
当n个顶点的有向网络和源点都给定以后,如何求得该源点到其余各顶点的最短路径?
迪杰斯拉特提出了一个解决此问题的简单方法,即按最短路径长度由小到大的次序,逐步求得每一条最短路径。
迪杰斯拉特算法中三个辅助数组的作用:
1、d[i]记录从源点Vx到顶点Vi的“当前最短的”路径长度值
2、path[i]记录从源点Vx到顶点Vi的"当前最短的"路径上倒数第二个顶点的序号
3、s[i]=true表示从源点Vx到顶点Vi的最短路径已最终确定;s[i]=false表示源点Vx到顶点Vi的最短路径尚未最终确定。
算法key process:
初始化,确定第i条最短路径的终点,修正源点到其余各顶点的最短路径。直到全部确定完毕为止
代码:
//迪杰斯特拉算法
template <class T>
void ExtMGraph<T>::Dijkstra(int v,T* d,int* path)
{int i,k,w; if (v<0||v>n-1) {cout<< “OutOfBounds”; return;}bool *s=new bool[n]; for (i=0;i<n;i++){s[i]=false; d[i]=a[v][i];if (i!=v && d[i]<INFTY) path[i]=v;else path[i]=-1;}
s[v]=true; //d[v]=0; for (i=1;i<n;i++){//确定第i条最短路径的终点序号kk=Choose(d,s);s[k]=true; //修正源点到其余各顶点的最短路径 for (w=0; w<n; w++) if (!s[w] && d[k]+a[k][w]< d[w]){ d[w]=d[k]+a[k][w]; path[w]=k;}}
}
template <class T>
int ExtMGraph<T>::Choose(int* d, bool* s)
{int i,minpos; T min;min=INFTY; minpos=-1;for (i=1;i<n;i++)if (d[i]<min &&!s[i]){min=d[i];minpos=i;}return minpos;
}
算法分析:
-上述算法的执行时间为O(n^2);
-如果只希望求从源点到某一特定顶点之间的最短路径,也需要与求单源最短路径相同的时间复杂度O(n^2)
单源最短路径-迪杰斯拉特算法相关推荐
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- 简单介绍迪杰斯拉Dijkstra算法步骤
将所有顶点分成两个集合, 一个是已选顶点集合,一个是未选顶点集合.并通过不断更新三个列表结点信息,实现这两个集合间的不断转化.第一个列表(Nodes Visited)存储结点是否已被访问的信息,已被访 ...
- 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)
前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...
- 算法导论-上课笔记11:单源最短路径
文章目录 0 前言 0.1 最短路径的几个变体 0.2 最短路径的最优子结构 0.3 负权重的边 0.4 环路 0.5 最短路径的表示 0.6 松弛操作 0.7 最短路径和松弛操作的性质 1 Bell ...
- c语言单源最短路径问题实验报告,数据结构课程设计最短路径问题实验报告-20210320182652.docx-原创力文档...
IMB standardization office[IMB 5AB- IMBK 08- IMB 2C] IMB standardization office[IMB 5AB- IMBK 08- IM ...
- NYOJ有趣的问题(单源最短路径dijkstra)
思路:这题的难度主要是在建图上,建完图之后就是求单源最短路径问题.可用dijkstra算法.要注意他给出的墙的x坐标不是有序 的. #include<stdio.h> #include&l ...
- 最短路径——迪杰斯坷垃算法(有向图、单源最短路径)
最短路径的算法有两种:迪杰斯坷垃算法和弗洛伊德算法. 但是两种算法各有优劣: 迪杰斯坷垃算法适合单源点最短路径的获取, 弗洛伊德算法适合各点间最短路径的获取,即多源点最短路径的获取: 今天主要讲解迪杰 ...
- 单源最短路径-Dijkstra(迪杰斯特拉算法)
迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...
- 单源最短路径之迪杰斯特拉算法(C语言)
Dijkstra(迪杰斯特拉)算法 采用广度优先搜索思想,对有向赋权图寻找最短路径. 该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法. 时间复杂度:O(n^2) 基本原理:不断为为 ...
最新文章
- 数据蒋堂 | 非常规聚合
- C语言基础总结Part
- C++根据系统时间生成不重复的随机数
- uwp post php,window_Win10开发系列专题五 UWP应用添加画布及语音输入支持,这是微软Win10十个开发系列专 - phpStudy...
- 雷林鹏分享:Lua 面向对象
- Windowstelnet服务怎么开启 Win11telnet服务怎么开启详细介绍
- puppet经典应用
- Python中如何清空Queue?
- 深入理解@Lazy注解
- 注塑成型缺陷熔接痕产生原因及解决方案
- ORACLE局域网连接
- Cocos2d-Html5--打怪升级之路
- java简易日历表_java简易日历代码
- C#毕业设计——基于C#+asp.net+sqlserver的汽车修理厂物资流通管理系统设计与实现(毕业论文+程序源码)——物资流通管理系统
- 《那些年啊,那些事——一个程序员的奋斗史》——41
- 网站被攻击如何查找木马文件 以及攻击者IP
- 跨境电商如何解决供应链物流效率、交付等重点问题
- C++中的char,char*,char[]
- 论文投稿必看,审稿人意见互相矛盾,作者该怎么办?
- 基于MATLAB的路面裂缝检测识别算法仿真