#include <vector> #include <list> #include <iterator> #include <algorithm> #include <numeric> #include <functional> #include <climits> using namespace std; int vecCounter = 0; int SourceVector = 0; vector<vector<int> > g;//存储graph信息 vector<bool> known;//标记是否探明各点最短路径 vector<int> dist;//各点的最短路径长度 vector<int> preVector;//各点最短路径下的前一个顶点 void Dijkstra(int s) { known.assign(vecCounter, false); dist.assign(vecCounter, INT_MAX); preVector.resize(vecCounter);//初始化known, dist, preVector dist[s] = 0; for(;;) { int min = INT_MAX, v = s; for(int i = 0; i<vecCounter; i++) if(!known[i] && min > dist[i]) { min = dist[i]; v = i; } if(min == INT_MAX) break; known[v] = true; for(int w = 0; w<vecCounter;w++) { if (!known[w] && g[v][w] < INT_MAX && dist[w] > dist[v] + g[v][w]) { dist[w] = dist[v] + g[v][w]; preVector[w] = v; } } } } void Print_SP(int v) { if (v != SourceVector) Print_SP(preVector[v]); cout << v << " "; } main int main() { vecCounter = 7; g.assign(vecCounter, vector<int>(vecCounter, INT_MAX)); g[0][1] = 2; g[0][3] = 1; g[0][2] = 4; g[1][3] = 3; g[1][4] = 10; g[2][0] = 4; g[2][5] = 5; g[3][2] = 2; g[3][4] = 2; g[3][5] = 8; g[3][6] = 4; g[4][6] = 6; g[6][5] = 1; SourceVector = 0; Dijkstra(0); copy(dist.begin(), dist.end(), ostream_iterator<int>(cout, " ")); cout << endl; for (int i = 0; i < vecCounter; ++i) if(dist[i] != INT_MAX) { cout << SourceVector << "->" << i << ": "; Print_SP(i); cout << endl; } system("pause"); return 0; }