最短路徑

 

  1. #define MAXVEX 9 
  2. #define INFINITY 65535 
  3. typedef int Patharc[MAXVEX];//數組值爲數組下標的前驅結點下標  
  4. typedef int ShortPathTable[MAXVEX];//存儲到各個結點的最短路徑值 
  5.  
  6. void ShortestPath_Dijkstra(MGraph MG,int v0,Patharc *P,ShortPathTable *D){ 
  7.     int v,w,k,min; 
  8.     int final[MAXVEX];//當final[w]=1,說明已經求得了v0=vw的最短路徑,我們不需要再考慮了  
  9.     for(v=0;v<G.numVertexes;v++){//初始化  
  10.         final[v] = 0;//最開始全部頂點都初始化爲未知最短路徑的狀態  
  11.         (*D)[v] = G.arc[v0][v];//將於v0相關的連線的頂點加上權值  
  12.         (*P)[v] = 0;//初始化都爲0  
  13.     } 
  14.     (*D)[v0] = 0;//v0至v0的路徑我們不需要求  
  15.     final[v0] = 1;//同上  
  16.     for(v=1;v<G.numVertexes;v++){//主循環,每次求得v0到某個頂點v的最短路徑  
  17.         min = INFINITY; 
  18.         for(w=0;w<G.numVertexes;w++){//遍歷數組D,尋找與v0最近的頂點,已經找到路徑的頂點final=1就不需要再參與了  
  19.             if(!final[w] && (*D)[w]<min){ 
  20.                 k = w;//找到後k存儲這個最近點的下標  
  21.                 min = (*D)[w];//找到後min存儲這個最短路徑的權值和  
  22.             } 
  23.         } 
  24.         final[k] = 1;//找到後就更新以後不用再找了  
  25.         for(w=0;w<G.numVertexes;w++){//更新最短路徑數組  
  26.             if(!final[w]&&((min+G.arc[k][w])<(*D)[w])){//如果經過的v的路徑小於當前D數組中的路徑,就更新  
  27.                 (*D)[w] = min + G.arc[k][w];//更新數組D  
  28.                 (*P)[w] = k;//更新路徑的前驅結點  
  29.             } 
  30.         } 
  31.     } 
  32. }  
  33.  
  34. typedef int Pathmatrix[MAXVEX][MAXVEX] 
  35. typedef int ShortPathTable[MAXVEX][MAXVEX] 
  36.  
  37. void ShortestPath_FLoyd(MGraph G,Pathmatrix *P,ShortPathTable *D){ 
  38.     int v,w,k; 
  39.     for(v=0;v<G.numVertexes;++v){//初始化P和D  
  40.         for(w=0;w<G.numVertexes;++w){ 
  41.             (*D)[v][w] = G.matrix[v][w];//初始化爲鄰接矩陣  
  42.             (*P)[v][w] = w; 
  43.         } 
  44.     } 
  45.     for(k=0;k<G.numVertexes;++k){//k代表中轉頂點的下標  
  46.         for(v=0;v<G.numVertexes;++v){//v代表行  
  47.             for(w=0;w<G.numVertexes;++w){//w代表列  
  48.                 if((*D)[v][w]>(*D)[v][k]+(*D)[k][w]){//如果經過下標k頂點的路徑比原來兩點間的距離更短,則更新  
  49.                     (*D)[v][w] = (*D)[v][k]+(*D)[k][w];//更新路徑信息  
  50.                     (*P)[v][w] = (*P)[v][k];//更新前驅結點信息  
  51.                 } 
  52.             } 
  53.         } 
  54.     } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章