- #define MAXVEX 9
- #define INFINITY 65535
- typedef int Patharc[MAXVEX];//數組值爲數組下標的前驅結點下標
- typedef int ShortPathTable[MAXVEX];//存儲到各個結點的最短路徑值
- void ShortestPath_Dijkstra(MGraph MG,int v0,Patharc *P,ShortPathTable *D){
- int v,w,k,min;
- int final[MAXVEX];//當final[w]=1,說明已經求得了v0=vw的最短路徑,我們不需要再考慮了
- for(v=0;v<G.numVertexes;v++){//初始化
- final[v] = 0;//最開始全部頂點都初始化爲未知最短路徑的狀態
- (*D)[v] = G.arc[v0][v];//將於v0相關的連線的頂點加上權值
- (*P)[v] = 0;//初始化都爲0
- }
- (*D)[v0] = 0;//v0至v0的路徑我們不需要求
- final[v0] = 1;//同上
- for(v=1;v<G.numVertexes;v++){//主循環,每次求得v0到某個頂點v的最短路徑
- min = INFINITY;
- for(w=0;w<G.numVertexes;w++){//遍歷數組D,尋找與v0最近的頂點,已經找到路徑的頂點final=1就不需要再參與了
- if(!final[w] && (*D)[w]<min){
- k = w;//找到後k存儲這個最近點的下標
- min = (*D)[w];//找到後min存儲這個最短路徑的權值和
- }
- }
- final[k] = 1;//找到後就更新以後不用再找了
- for(w=0;w<G.numVertexes;w++){//更新最短路徑數組
- if(!final[w]&&((min+G.arc[k][w])<(*D)[w])){//如果經過的v的路徑小於當前D數組中的路徑,就更新
- (*D)[w] = min + G.arc[k][w];//更新數組D
- (*P)[w] = k;//更新路徑的前驅結點
- }
- }
- }
- }
- typedef int Pathmatrix[MAXVEX][MAXVEX]
- typedef int ShortPathTable[MAXVEX][MAXVEX]
- void ShortestPath_FLoyd(MGraph G,Pathmatrix *P,ShortPathTable *D){
- int v,w,k;
- for(v=0;v<G.numVertexes;++v){//初始化P和D
- for(w=0;w<G.numVertexes;++w){
- (*D)[v][w] = G.matrix[v][w];//初始化爲鄰接矩陣
- (*P)[v][w] = w;
- }
- }
- for(k=0;k<G.numVertexes;++k){//k代表中轉頂點的下標
- for(v=0;v<G.numVertexes;++v){//v代表行
- for(w=0;w<G.numVertexes;++w){//w代表列
- if((*D)[v][w]>(*D)[v][k]+(*D)[k][w]){//如果經過下標k頂點的路徑比原來兩點間的距離更短,則更新
- (*D)[v][w] = (*D)[v][k]+(*D)[k][w];//更新路徑信息
- (*P)[v][w] = (*P)[v][k];//更新前驅結點信息
- }
- }
- }
- }
- }