ACM算法:迪杰斯特拉最短路径
来源:互联网 发布:优化9蒙古入侵 编辑:程序博客网 时间:2024/06/05 04:51
迪杰斯特拉的用途:迪杰斯特拉算法用于求出图中一个结点到其他所有结点的最短路径。迪杰斯
特拉算法是求最短路径中较为常用的算法,而且方便使用易于理解,很适合用来当成最短路径入
门的模板实例算法。无论是在有向图还是无向图,都有它的优势之处。
迪杰斯特拉的思路:迪杰斯特拉算法的思路非常的清晰,我结合图解来解释(图是网上找的,如
有雷同,纯属巧合)
先解释各个字母所代表的意思:S代表已经找到了最短路径的点,u代表目前的点到所连接的最短路径的点,dist储存目前起始点到该点的最短路径。
(起始点为“1”)
逻辑主线:
第一步:将与起始点直接连接的点的距离储存在dist数组中,找出到其中最短路径的点。如图中的点“2”,则10就是点“1”到点“2”的最短路径,因为从“1”经过其他点间接连接点“2”的点一定会比10 大(仔细想想就知道了)。
第二步:将(点“2”直接连接的点的距离 + 10)储存在dist数组中,如果原先数组中该点所在的位置已经有值,则比较,新值更小则替换。其中dist数组中值最小的点就是起始点到该点的最短距离,如图中sist[4]。
之后重复第二步的操作,直到将结点全部遍历。
注:每找出一个最短距离就将该点标记为一遍历,也就说需要(结点书-1)次循环
附上代码说明:
/*迪杰斯特拉算法求某个顶点到其余顶点的最短路径*/
/*代码示例使用邻接矩阵来展示*/void DIJ(MGraph &G, int v){int i, j, k, min;int final1[MAX_VERTEX_NUM];//该数组用来标识顶点是否已确定了最短路径 int dist[MAX_VERTEX_NUM];string path[2 * MAX_VERTEX_NUM];for (i = 0; i<G.vexnum; i++){//初始化工作 dist[i] = G.edges[v][i];//dist数组用来存储当前找到的v到其他各顶点的最短路径 if (dist[i]<MAX)path[i] = G.vexs[v] + G.vexs[i];//如果v到i有边的话,把顶点字符存到path字符数组中,表示路径 elsepath[i] = "";final1[i] = 0;//初始化标识数组为0 }dist[v] = 0;final1[v] = 1;for (j = 1; j<G.vexnum; j++){min = MAX;for (i = 0; i<G.vexnum; i++)if (dist[i]<min && final1[i] == 0){min = dist[i];k = i;}//找到dist数组中最小值的位置k cout << path[k] << " " << dist[k] << endl;//输出最短路径 final1[k] = 1;//设置标志位 for (i = 0; i<G.vexnum; i++){//遍历每个顶点i和当前的已求出的最短路径的顶点k作比较,若从源点经过顶点k到顶点i的路径,比dist[i]小, //则更新顶点dist[i] if (dist[i]>dist[k] + G.edges[k][i] && final1[i] == 0){dist[i] = dist[k] + G.edges[k][i];path[i] = path[k] + G.vexs[i];}}//从整体上来看就是算出k的邻接点的当前最短路径 }}
总结:迪杰斯特拉算法的便利性以及其思路的清晰性得到了很高的认可,属于数据结构中常用、
也是ACM求最短路径的入门首选,需要我们去掌握。
阅读全文
0 0
- ACM算法:迪杰斯特拉最短路径
- (ACM)Dijkstra最短路径算法
- ACM-Floyed算法求两点之间的最短路径
- HDU ACM 3790最短路径问题(SPFA算法实现)
- 迪杰斯特拉最短路径算法
- ACM中的图中关于最短路径的dijistra算法和bellman_ford算法
- ACM 算法
- ACM算法
- ACM算法
- ACM学习路径
- 数据结构之 迪杰斯特拉最短路径算法
- Pku acm 2253 Frogger数据结构题目解题报告(六)—单源最短路径:Dijkstra算法
- Pku acm 1062 昂贵的聘礼 数据结构题目解题报告(七)—单源最短路径:Dijkstra算法
- 图论中最短路径各算法的精典代码片段-来自ACM
- POJ 3436-ACM Computer Factory(最大流输出路径-Edmond-Karp算法)
- 算法:ACM算法学习
- ACM+算法集--常用ACM算法
- 迪杰斯特拉最短路径算法 严蔚敏C++实现
- Git 命令小结
- numpy 切片操作
- 实验二 线性表综合实验(单链表)
- C++常用小知识点总结
- java List 排序 Collections.sort() 对 List 排序
- ACM算法:迪杰斯特拉最短路径
- leetcode Product of Array Except Self 生成除自己之外的数组
- [CODE【VS】]江哥的DP题d
- 1. STM32F10X-架构
- linux 命令小结
- python 爬虫爬取所有上市公司公告信息(一)
- SpringBoot24-spingboot数据访问-声明式事务
- 新建一个Maven Web项目jsp出现错误(关于Tomcat服务器)
- Java并发编程 07 Executors框架