【数据结构】图的应用之最短路径

参考资料:《数据结构(C语言版)严蔚敏著》
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...


最短路径

Dijkstra算法 

求顶点\large \dpi{100} \fn_cm v_{s}到其余各顶点的最短距离:
(1)假设用带权的邻接矩阵arcs来表示带权有向图,arcs[i][j]表示弧\large \dpi{100} \fn_cm <v_{i}, v_{j}>上的权值。若\large <v_{i}, v_{j}>不存在,则置arcs[i][j]为∞。V为所有顶点的集合。S为已经找到从\large v_{s}出发的最短路径的终点的集合,它的初始状态为空集。D[i]为从\large v_{s}出发到图上其余各顶点\large v_{i}可能达到的最短路径长度,初值为D[i]=arcs[s][i],\large v_{i}∈V。
(2)从V-S中找出\large v_{j},满足D[j]=Min{D[i] | \large v_{i}∈V-S},那么vj就是当前找到的一条从\large v_{s}出发的最短路径的终点。将j加入S中。
(3)修改从\large v_{s}出发到集合V-S上任一顶点\large v_{k}可达的最短路径长度,如果D[j]+arcs[j][k] (4)重复操作(2)、(3)共n-1次。由此求得从\large v_{s}到图上其余各顶戴呢的最短路径是依路径长度递增的序列。

void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortPathTable &D){
    //用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]。
    //若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
    //final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。
    for(v=0; v

Floyd算法

假设求从顶点\large v_{i}\large v_{j}的最短路径。如果从\large v_{i}\large v_{j}有弧,则从\large v_{i}\large v_{j}存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探。首先考虑路径\large (v_{i}, v_{0}, v_{j})是否存在(即判别弧\large (v_{i}, v_{0})\large (v_{0}, v_{j})是否存在)。如果存在,则比较\large (v_{i}, v_{j})\large (v_{i}, v_{0}, v_{j})的路径长度取长度较短者为从\large v_{i}\large v_{j}的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点\large v_{1},也就是说,如果\large (v_{i}, ..., v_{1})\large (v_{1}, ..., v_{j})分别是当前找到的中间顶点的序号不大于1的最短路径,那么\large (v_{i}, ..., v_{1}, ..., v_{j})就有可能是从v_{i}v_{j}的中间顶点不大于1的最短路径。将它和已经得到的从\large v_{i}\large v_{j}中间顶点选好不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个顶点\large v_{2},继续进行试探。依次列推。在一般情况下,若\large (v_{i}, ..., v_{k})\large (v_{k}, ..., v_{j})分别是从\large v_{i}\large v_{k}和从\large v_{k}\large v_{j}的中间顶点的序号不大于k-1的最短路径,则将\large (v_{i}, ..., v_{k}, ..., v_{j})和已经得到的从\large v_{i}\large v_{j}且中间顶点序号不大于k-1的最短路径相比较,其长度较短者便是从\large v_{i}\large v_{j}的中间顶点的序号不大于k的最短路径。这样,在经过n次比较后,最后求得的必是\large v_{i}\large v_{j}的最短路径。按此方法,可以同时求得各对顶点间的最短路径。

现定义一个n阶方阵序列,其中n为顶点数。
D^{(-1)},D^{(0)},D^{(1)},..., D^{(k)},...,D^{(n-1)}
其中,
D^{(-1)}[i][j]=G.arcs[i][j]
D^{(k)}[i][j]=Min\{D^{(k-1)}[i][j], D^{(k-1)}[i][k]+D^{(k-1)}[k][j]\}\ \ 0 \leqslant k \leqslant n-1,是从vi到vj的中间顶点的序号不大于k的最短路径的长度;D^{(n-1)}[i][j]就是从vi到vj的最短路径的长度。
 

void ShortestPath_FLOYD(MGraph G, PathMatrix &P[], DistancMatrix &D){
    //用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]。
    //若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。
    for(v=0; v

 

你可能感兴趣的:(【专题】数据结构,温故知新)