資料結構 最短路徑問題

2021-09-25 07:45:41 字數 2393 閱讀 1472

求解這個問題的時候我們用到dijkstra演算法,演算法的描述如下:

(1)首先定義乙個陣列用來儲存從源點到每乙個頂點的最短路徑(不可達用無窮表示),使用s集合來儲存已經求得最短路徑的頂點,那麼剩餘頂點就存放在集合t中

(2)第一次迭代的時候s只有源點,然後根據s集合中的頂點來更新最短路徑陣列d中的值,每次選擇不在集合s中且路徑最短的頂點加入集合s

(3)根據集合s的頂點更新最短路徑,如果d[j] + arc[j][k] < d[k] , 那麼d[k] = d[j] + arc[j][k]

(4)執行n-1次(2)和(3)就可以得到源點到所有頂點的最小路徑了

//最短路徑問題之dijkstra演算法//

typedef int pathmatirx1[maxvex]; //用於記錄最短路徑所經過的路徑下標

typedef int shortpathtable1[maxvex];//用於記錄起始點到下標頂點的最短路徑權值

//演算法主體

void shortestpath_dijkstra(mgraph *g, int v0, pathmatirx1 *p, shortpathtable1 *d)

//初始化第乙個頂點

(*d)[v0] = 0; //第乙個頂點到第乙個頂點的權值為0

final[v0] = 1; //表示第乙個頂點已經加入最短路徑

//開始主迴圈,求v0到各個頂點的最短路徑

for (v = 1; v < g->vertex_num; v++)

} //出迴圈的時候已經找到了目前可以達到的最短路徑

final[k] = 1;

//接下來更新最短路徑表

for (w = 0; w < g->vertex_num; w++)

} }//列印最短路徑

printf("最短路徑為:\n");

for (v = 1; v < g->vertex_num; v++)

}

儲存方式為鄰接矩陣

dijkstra演算法的時間複雜度為o(n^3),還有一種時間複雜度也是o(n^3)的演算法,叫做floyd演算法。

演算法的描述如下:

先初始化乙個鄰接矩陣用來儲存每個路徑之間的距離,然後每次加入乙個頂點,重新計算每個頂點間的最短路徑,知道加入了n個頂點為止,最後得到的矩陣d^(k-1)就是最終得到的最短路徑。

我記得離散數學圖論中說鄰接矩陣的n次方表示每個頂點到每個頂點中間頂點的序號不大於n的最短路徑,不知道我有沒有記錯。

//最短路徑問題之floyd演算法//

typedef int pathmatirx[maxvex][maxvex];

typedef int shortpathtable[maxvex][maxvex];

void shortestpath_floyd(mgraph *g, pathmatirx *p, shortpathtable *d)

} //接下來開始主迴圈

//最外層迴圈為中間路徑

//中間迴圈為起始點

//最裡層迴圈為終點

for (k = 0; k < g->vertex_num; k++)

}} }

//列印距離矩陣

printf("距離矩陣為:\n");

printf("\t");

for (v = 0; v < g->vertex_num; v++)

printf("\n\n");

for (v = 0; v < g->vertex_num; v++)

printf("\n\n");

} printf("\n\n");

//列印路徑矩陣

printf("路徑矩陣為:\n\t");

for (v = 0; v < g->vertex_num; v++)

printf("\n\n");

for (v = 0; v < g->vertex_num; v++)

printf("\n\n");

} printf("\n");

//列印最短路徑

for (v = 0; v < g->vertex_num; v++)

printf(" -> v%d", w);

printf("\n");

} printf("\n");

}}

資料結構之最短路徑問題

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

資料結構 最短路徑 Dijkstra

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 ...

資料結構實驗 最短路徑

實驗內容 對於使用者隨機輸入的乙個有向帶權圖,求從某個頂點到其他各頂點的最短路徑。include define maxv 20 define inf 32 若不存在,則設的權為32,表示無窮大 typedef struct vertextype 頂點型別 typedef struct matgrap...