图(Graph)-最短路径

最短路径问题---Dijkstra算法详解

1.基本概念

最短路径:
从图中某一顶点(源点)达到另一顶点(终点)找到一条路径,言辞路径上各边的权值总和(称为
路径长度)达到最小。
单源最短路径:
已知有向带权图(简称有向网)G=(V,E),找出从某个属于V的源点S到V中其余各顶点的最短路径。

习惯上称路径开始顶点为源点,路径的最后一个顶点为终点。


最短路径的最优子结构性质:
该性质描述为:如果P(i,j)={Vi...Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上
的一个中间顶点,那么P(k,s)必定是k到s的最短路径。下面证明该性质的正确性。

2.迪杰斯特拉(Dijkstra)算法

有上述性质可知,如果存在一条从i到j的最短路径(Vi......Vk,Kj),Vk是Vj前面的一个
顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra
[muten@localhost Dijkstra]$ g++ main.cpp Dijkstra.cpp Dijkstra.h
Dijkstra.h:8:9: warning: #pragma once in main file
    8 | #pragma once
      |         ^~~~
[muten@localhost Dijkstra]$ ./a.out 
输入图的顶点个数和边的条数:
6 8
请输入每条边的起点和终点(顶点编号从1开始)以及其权重
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 6 60
5 4 20
图的邻接矩阵为:
∞	∞	10	∞	30	100	
∞	∞	5	∞	∞	∞	
∞	∞	∞	50	∞	∞	
∞	∞	∞	∞	∞	10	
∞	∞	∞	20	∞	60	
∞	∞	∞	∞	∞	∞	
以v1为起点的图的最短路径情况为:
ShortesPathLen [ v1-->v1 ] = 0
============== [ v1-->v2 ] 是无最短路径的
ShortesPathLen [ v1-->v3 ] = 10
ShortesPathLen [ v1-->v5-->v4 ] = 50
ShortesPathLen [ v1-->v5 ] = 30
ShortesPathLen [ v1-->v5-->v4-->v6 ] = 60

猜你喜欢

转载自blog.csdn.net/Edidaughter/article/details/121072325