求解這個問題的時候我們用到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...