我想知道如何修改這個函數來保存節點的最短路徑。這是從我的教科書小修改。修改Dijkstra的算法以打印最短路徑中的節點
template <class vType, int size>
void weightedGraphType<vType, size>::shortestPath(vType vertex) {
int i, j;
double minWeight;
for (j = 0; j < gSize; j++) {
smallestWeight[j] = weights[vertex][j];
}
bool weightFound[size];
for (j = 0; j < gSize; j++) {
weightFound[j] = false;
}
for (i = 0; i < gSize; i++) {
int v;
cout << vertex << " to " << i << endl;
minWeight = INFINITY;
for (j = 0; j < gSize; j++) {
if (!weightFound[j]) {
if (smallestWeight[j] < minWeight) {
v = j;
minWeight = smallestWeight[v];
}
}
}
weightFound[v] = true;
for (j = 0; j < gSize; j++) {
if (!weightFound[j]) {
if (minWeight + weights[v][j] < smallestWeight[j]) {
smallestWeight[j] = minWeight + weights[v][j];
}
}
}
} //end for
} //end shortestPath
跟蹤包括最短路徑的節點,並打印在最後。你在某個特定部分遇到問題嗎? –
主循環內的第一個for循環找到權重最低的第二個節點。下一個循環找到從第二個節點到目標節點的路徑。如果每次使用新值設置最小權重時只保存該值,那麼對於不是最短的路徑,其中會有額外的值。我的問題是,如何保存最短路徑中的節點列表,忽略其他路徑?如果這是一個遞歸算法,它會更清晰。 – s00pcan
這裏有一個很重要的提示:從路徑的盡頭開始,向後工作。 –