最短路径dijkstra算法
const int MAXINT = 32767; const int MAXNUM = 10; int dist[MAXNUM]; int prev[MAXNUM]; int A[MAXUNM][MAXNUM]; void Dijkstra(int v0) { bool S[MAXNUM]; // 判断是否已存入该点到S集合中 int n=MAXNUM; for(int i=1; i<=n; ++i) { dist[i] = A[v0][i]; //初始化dist数组 S[i] = false; // 初始都未用过该点 if(dist[i] == MAXINT) prev[i] = -1; //prev[]表示当前节点的前一个结点 else prev[i] = v0; } dist[v0] = 0; S[v0] = true; for(int i=2; i<=n; i++) { int mindist = MAXINT; int u = v0; // 找出当前未使用的点j的dist[j]最小值 for(int j=1; j<=n; ++j) if((!S[j]) && dist[j]<mindist) //dist[j] < middist 表明当前节点的邻节点未被访问,这个和for循环一起使用表明寻找当前节点的最小dist[]的值 { u = j; // u保存当前邻接点中距离最小的点的号码 mindist = dist[j]; } S[u] = true; //每次找到最小的dist然后将这个设为true for(int j=1; j<=n; j++) if((!S[j]) && A[u][j]<MAXINT) { if(dist[u] + A[u][j] < dist[j]) //在通过新加入的u点路径找到离v0点更短的路径 { dist[j] = dist[u] + A[u][j]; //更新dist prev[j] = u; //记录前驱顶点 } } } }
V为当前节点,A,B,C 为之前的节点(未被收进dist数组中的节点)X,Y,Z为V的邻节点,那么下一个节点总是再A,B,C,X,Y,Z中取dist[]最小的节点