[英]Dijkstra Algorithm not outputting correctly
我在實現Dijkstra算法時遇到麻煩。
我初始化了以下變量:
enum GraphLimit300 {MAX_NODES = 50};
typedef unsigned int Element300;
Element300 adjacencyMatrix[MAX_NODES][MAX_NODES];
Element300 distanceArray[MAX_NODES];
bool visitedSet[MAX_NODES];
int numberNodes;
這是我當前對算法的實現:int startNode; 訪問過int
unsigned int smallest = UINT_MAX;
do
{
startNode = getStartNode300();
setVisitedSet300();
smallest = UINT_MAX;
visitedSet[startNode] = true;
for (int i = 0; i < numberNodes; i++)
{
distanceArray[i] = adjacencyMatrix[startNode][i];
}
for (int i = 0; i < numberNodes - 1; i++)
{
for (int v = 0; v < numberNodes; v++)
{
if (visitedSet[v] == false)
{
if (distanceArray[v] < smallest)
{
smallest = distanceArray[v];
visited = v;
}
}
}
visitedSet[visited] = true;
for (int w = 0; w < numberNodes; w++)
{
if (visitedSet[w] == false)
{
distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
}
}
}
在這個特定的for循環上,應該執行一定的數學運算,以找到節點為假的某個索引處的值之間的最小值,並將最小值存儲在該索引中。 我發現是在它選擇distaceArray
中的distaceArray
並將其設置為true之后(如果我使用下面的數據文件從1開始,則為3,這是正確的。)。
for (int w = 0; w < numberNodes; w++)
{
if (visitedSet[w] == false)
{
distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
}
}
截至此特定迭代,它使用的節點為“ 0”和“ 2”,即節點為假。 並進行數學運算並將其存儲在錯誤的數組中。
我正在使用此數據集,該數據集將數字正確存儲在adjacencyMatrix
。
0 5 10 4294967295
4294967295 0 4294967295 3
4294967295 7 0 4294967295
4294967295 4294967295 4 0
正確的輸出是:
Distance[0] =4294967295
Distance[1] =0 //Which is the node that I choose to start with
Distance[2] =7
Distance[3] =3
我得到的是:
Distance[0] =3
Distance[1] =0
Distance[2] =3
Distance[3] =3
我已經手工完成了此過程,以確認我應該獲取的正確輸出是正確的並且是正確的。
在以下情況下更新:
if (visitedSet[w] == false && adjacencyMatrix[visited][w] != UINT_MAX)
{
distanceArray[w] = min(distanceArray[w], distanceArray[visited] + adjacencyMatrix[visited][w]);
}
這里的問題還是,您只考慮存在的邊,即adjacencyMatrix[visited][w]!=UINT_MAX
。
如果不排除這些邊緣, distanceArray[visited] + adjacencyMatrix[visited][w]
將溢出,並且min()
將不會返回您期望的結果。
您可以通過更改以下行來解決此問題:
if (visitedSet[w] == false && adjacencyMatrix[visited][w]!=UINT_MAX )
編輯:
在嵌套的for循環中確實確實存在另一個問題。 第一個內部for循環每次都會尋找最短的exp子路徑。 不幸的是,您沒有重置smallest
,因此它以上一次迭代的最小值開始。
如下更新循環,您將得到預期的結果:
for (int i = 0; i < numberNodes - 1; i++)
{
smallest = UINT_MAX; // !!!!!!!!!!!!!!!!!!!!!!!
for (int v = 0; v < numberNodes; v++)
{
...
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.