dijkstra算法计算最短路径和并输出最短路径

 1 void dijisitela(int d, int m1)
 2 {
 3     int dis[1000], book[1000], path[1000], u, v, min;
 4     l = 1;
 5     for (i = 0; i < n1; i++)
 6     {
 7         dis[i] = w[d][i];
 8         book[i] = 0;
 9         path[i] = -1;
10         midpath[0][i] = -1;
11     }
12     midsum[0] = 0;
13     book[0] = d;
14
15     //Dijkstra算法核心语句
16     for (i = 0; i < n1 - 1; i++)
17     {
18         //找到离d号顶点最近的顶点
19         min = fmax;
20         for (j = 0; j < n1; j++)
21         {
22             if (book[j] == 0 && dis[j] < min)
23             {
24                 min = dis[j];
25                 u = j;
26             }
27         }
28         book[u] = 1;
29         for (v = 0; v < n1; v++)
30         {
31             if (w[u][v] < fmax)
32             {
33                 if (dis[v] > dis[u] + w[u][v])
34                 {
35                     dis[v] = dis[u] + w[u][v];
36                     path[v] = u;
37                 }
38             }
39         }
40     }
41     for (i = 0; i < n1; i++)
42         if (w[d][i] < fmax) path[i] = -1;
43     stack <int> q;//由于记录的中途节点是倒序的,所以使用栈(先进后出),获得正序
44     j = m1;
45     while (path[j] != -1)      //如果j有中途节点
46     {
47         q.push(j);          //将j压入堆
48         j = path[j];          //将j的前个中途节点赋给j
49     }
50     q.push(j);
51     midpath[0][0] = d;
52     while (!q.empty())       //先进后出,获得正序
53     {
54         midpath[0][l++] = q.top();
55         q.pop();            //将堆的头节点弹出
56     }
57     for (i = 1; i < n1; i++)
58         if (midpath[0][i] != -1)
59         {
60             midsum[0] += w[midpath[0][i - 1]][midpath[0][i]];
61         }
62 }

如代码所示,边的权值存储在w[i][j]里,源节点为d,终节点为m1,运用典型的dijkstra算法得出最短路径和,并用“”最后一跳“”方法得出最短路径的经过节点值,关于最后一跳算法必定能得到最短路径经过的证明方法为:

最后一跳与终结点必定是直接相连的,也就是加上一个固定的w[][]值,那么就必须要求最后一跳这个点也达到“”“最短路径”“”,因此可以得证。

原文地址:https://www.cnblogs.com/ljy1227476113/p/10654427.html

时间: 2024-10-20 16:25:12

dijkstra算法计算最短路径和并输出最短路径的相关文章

Dijkstra算法——计算一个点到其他所有点的最短路径的算法

迪杰斯特拉算法百度百科定义:传送门 迪杰斯特拉算法用来计算一个点到其他所有点的最短路径,是一种时间复杂度相对比较优秀的算法 O(n2)(相对于Floyd算法来说) 是一种单源最短路径算法,但是它并不能处理负边权的情况 板子代码: #include<cstdio> #include<iostream> #include<cstdlib> #include<iomanip> #include<cmath> #include<cstring>

Dijkstra算法依据项目改进版,输出路径

package dijkstra; import java.util.ArrayList; public class Dijkstra { private static int N = 1000; /*private static int[][] Graph = { { 0, 1, 5, N, N, N, N, N, N }, { 1, 0, 3, 7, 5, N, N, N, N }, { 5, 3, 0, N, 1, 7, N, N, N }, { N, 7, N, 0, 2, N, 3,

求两点之间最短路径-Dijkstra算法

 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

Java数据结构 最短路径解法Dijkstra算法

本文为博主原创文章,未经博主允许不得转载! 1.1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(

最短路径-Dijkstra算法(转载)

注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

最短路径—Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessi