資料結構之最短路徑(Floyd)

2021-08-08 11:37:07 字數 2979 閱讀 1170

/* floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p[v][w]及帶權長度d[v][w]。 */

void shortestpath_floyd(mgraph g, patharc *p, shortpathtable *d)}}

}}

下面介紹下詳細的執行過程:

(1)程式開始執行,第4-11行就是初始化了d和p,使得它們成為   上圖    的兩個矩陣。從矩陣也得到,v0->v1路徑權值為1,v0->v2路徑權值為5,v0->v3無邊連線,所以路徑權值為極大值65535。

(2)第12~25行,是演算法的主迴圈,一共三層巢狀,k代表的就是中轉頂點的下標。v代表起始頂點,w代表結束頂點。

(3)當k = 0時,也就是所有的頂點都經過v0中轉,計算是否有最短路徑的變化。可惜結果是,沒有任何變化,如下圖所示。

(4)當k = 1時,也就是所有的頂點都經過v1中轉。此時,當v = 0 時,原本d[0][2] = 5,現在由於d[0][1] + d[1][2] = 4。因此由**的的第20行,二者取其最小值,得到d[0][2] = 4,同理可得d[0][3] = 8、d[0][4] = 6,當v = 2、3、4時,也修改了一些資料,請看下圖左圖中虛線框資料。由於這些最小權值的修正,所以在路徑矩陣p上,也要做處理,將它們都改為當前的p[v][k]值,見**第21行。

(5)接下來就是k = 2,一直到8結束,表示針對每個頂點做中轉得到的計算結果,當然,我們也要清楚,d0是以d-1為基礎,d1是以d0為基礎,......,d8是以d7為基礎的。最終,當k = 8時,兩個矩陣資料如下圖所示。

至此,我們的最短路徑就算是完成了。可以看到矩陣第v0行的數值與迪傑斯特拉演算法求得的d陣列的數值是完全相同。而且這裡是所有頂點到所有頂點的最短路徑權值和都可以計算出。

那麼如何由p這個路徑陣列得出具體的最短路徑呢?以v0到v8為例,從上圖的右圖第v8列,p[0][8]= 1,得到要經過頂點v1,然後將1取代0,得到p[1][8] = 2,說明要經過v2,然後2取代1得到p[2][8] = 4,說明要經過v4,然後4取代2,得到p[4][8]= 3,說明要經過3,........,這樣很容易就推倒出最終的最短路徑值為v0->v1->v2->v4->v3->v6->v7->v8。

求最短路徑的顯示**可以這樣寫:

for(v=0; v%d",k);    /* 列印路徑頂點 */

k=p[k][w];            /* 獲得下乙個路徑頂點下標 */

}printf(" -> %d\n",w);    /* 列印終點 */

}printf("\n");

}

總體的**如下:

#include "stdio.h"

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxedge 20

#define maxvex 20

#define infinity 65535

typedef int status;    /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef struct

mgraph;

typedef int patharc[maxvex][maxvex];

typedef int shortpathtable[maxvex][maxvex];

/* 構件圖 */

void createmgraph(mgraph *g)

for (i = 0; i < g->numvertexes; i++)/* 初始化圖 */

}g->arc[0][1]=1;

g->arc[0][2]=5;

g->arc[1][2]=3;

g->arc[1][3]=7;

g->arc[1][4]=5;

g->arc[2][4]=1;

g->arc[2][5]=7;

g->arc[3][4]=2;

g->arc[3][6]=3;

g->arc[4][5]=3;

g->arc[4][6]=6;

g->arc[4][7]=9;

g->arc[5][7]=5;

g->arc[6][7]=2;

g->arc[6][8]=7;

g->arc[7][8]=4;

for(i = 0; i < g->numvertexes; i++)}}

/* floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p[v][w]及帶權長度d[v][w]。 */

void shortestpath_floyd(mgraph g, patharc *p, shortpathtable *d)}}

}}int main(void)

printf(" -> %d\n",w);    /* 列印終點 */

}printf("\n");

}printf("最短路徑d\n");

for(v=0; v

printf("\n");

}printf("最短路徑p\n");

for(v=0; v

printf("\n");

}return 0;

}

資料結構之最短路徑(DijKstra)

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短路...

資料結構之最短路徑問題

1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,...

演算法和資料結構之最短路徑演算法

references 通常,我們發現沿著圖中的一條邊移動會有一些相關的成本 或利潤 例如邊的距離,汽油的 花費的時間等等。我們稱這之為加權圖,稱邊值為權值。我們將之前的圖定義擴充套件如下 加權圖g由有序序列 v,e,w 組成,其中v和e是頂點和邊,w是邊的權值。w a,b 50,w a,c 30等等...