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