普通Dijkstra:
1 void DijkstraPath(int v0,int vis[],int dist[],int path[]) 2 { 3 int onePath[maxn]; 4 int d; 5 int k; 6 for(int i = 0;i < n;i++) 7 { 8 if( vis[i] && i != v0) 9 { 10 cout<<"Path->"; 11 d = 0; 12 onePath[d] = i;//添加路径上的终点 13 k = path[i]; 14 if(k == -1) 15 { 16 cout<<"No paht"<<endl; 17 } 18 else 19 { 20 while(k != v0) 21 { 22 d++; 23 onePath[d] = k; 24 k = path[k]; 25 } 26 d++; 27 onePath[d] = v0;//添加起点 28 cout<<"Start :"<<onePath[d];//起点 29 for(int j = d - 1;j>=0;j--) 30 { 31 cout<<onePath[j]<<" "; 32 } 33 cout<<endl; 34 } 35 } 36 } 37 } 38 39 void Dijkstra(int v0) 40 { 41 int dist[maxn];//距离数组,每个点到v0的直接距离 42 int path[maxn];//路径数组,记录最短路径上的前驱结点 43 int vis[maxn]; 44 int u;//中间结点 45 memset(dist,0,sizeof(dist)); 46 memset(path,0,sizeof(path)); 47 memset(vis,0,sizeof(vis)); 48 int mindist; 49 for(int i = 0;i < n;i++) 50 { 51 dist[i] = Graph[v0][i]; 52 if(Graph[v0][i] < INF) 53 { 54 path[i] = v0;//开始与v0直连的点记录 55 } 56 else 57 { 58 path[i] = -1; 59 } 60 } 61 vis[v0] = 1;//开始时v0加入最短路中 62 path[v0] = 0; 63 for(int i = 0; i < n-1;i++) 64 { 65 mindist = INF; 66 for(int j = 0;j < n;j++) 67 { 68 if( !(vis[i]) && dist[j] < mindist)//找最短路 69 { 70 mindist = dist[j]; 71 u = j; 72 } 73 } 74 vis[u] = 1; 75 for(int i = 0 ; i < n;i++)//路径更新 76 { 77 if( !(vis[i]))////考虑剩下未访问的边 78 { 79 if( Graph[u][i] < INF && dist[i] > dist[u] + Graph[u][i] ) 80 //中间点的总路程比原来能直达的更短 81 { 82 dist[i] = dist[u] + Graph[u][i]; 83 path[i] = u;//更新前驱结点 84 } 85 } 86 } 87 } 88 //DijkstraPath( v0, vis,dist,path);//输入最短路径 89 }