簡體   English   中英

Dijkstra算法C ++錯誤輸出

[英]Dijkstra algorithm C++ Incorrect output

我的上一個問題得到了回答,但我想知道如何更改它以顯示最低路線已通過的路口? 謝謝

注意:driverMap是2D 14x14整數向量,其中包含到達每個頂點所需的距離。

void startFirst(vector< vector<int> > driverMap, vector<Car> allCars, int congestFactor)
{
    clock_t start = clock();
    int Intersections[driverMap.size()];
    int Distances[driverMap.size()];

    for(int i = 0; i < driverMap.size(); i++)
    {
        Intersections[i] = i;
    }

    for(int i = 0; i < driverMap.size(); i++)
    {
        cout << "Intersection '" << i << "': "; 
        for(int k = 0; k < driverMap.size(); k++)
        {
            cout << driverMap[i][k] << "|";
        }
        cout << endl;
    }

    for(int i = 0; i < 1; i++)
    {
        int startInt = allCars[i].getStart();
        Intersections[startInt] = -1;
        Distances[startInt] = 0;

        for (int i = 0; i < driverMap.size(); i++) 
        {
            if(i != startInt)
            {
                Distances[i] = driverMap[startInt][i];
            }
        }

        cout << "FOR INTERSECTION: '" << startInt << "'" << endl;
        cout << endl;

        for (int l = 0; l < driverMap.size(); l++) 
        {
            if(l != startInt)
            {
                Dijkstra(driverMap, Intersections, Distances);
            }
        }

        for (int k = 0; k < driverMap.size(); k++) 
        {
            cout << Distances[k] << "|";
        }
    }
    cout << "Total time simulated: " << (clock() - start ) / (double) CLOCKS_PER_SEC << endl;
}

void Dijkstra(vector< vector<int> > driverMap, int Intersections[], int Distances[]) 
{
    int minValue = 9999;
    int minNode = 0;

    for (int i = 0; i < driverMap.size(); i++) 
    {
        if (Intersections[i] == -1) 
        { 
            continue; 
        }

        if (Distances[i] > 0 && Distances[i] < minValue) 
        {
            minValue = Distances[i];
            minNode = i;
        }
    }

    Intersections[minNode] = -1;

    for (int i = 0; i < driverMap.size(); i++) 
    {
        if (driverMap[minNode][i] < 0) 
        { 
            continue; 
        }

        if (Distances[i] < 0) 
        {
            Distances[i] = minValue + driverMap[minNode][i];
            continue;
        }

        if ((Distances[minNode] + driverMap[minNode][i]) < Distances[i]) 
        {
            Distances[i] = minValue + driverMap[minNode][i];
        }
    }
}

手動繪制下面的圖可以支持@ hk6279的答案。 從“ 13”到達時,無法達到“ 0”的最佳路徑。 它應該是從“ 1”或“ 4”到“ 0”,並已指出@ hk6279並且正確計算了程序,最佳路徑是距離5200的“ 5”-“ 8”-“ 4”-“ 0”。

在此處輸入圖片說明

您的問題是:不正確的假設。 您的假設是錯誤的,因為從5到4沒有直接訪問權限。

您所聲稱的是,您可以從5到達0的是路徑5-4-0 ,距離為4800 (2600 + 2200)。 但是,事實是您只能通過距離為5200 (1500 + 1500 + 2200)的代碼獲得路徑5-8-4-0

請注意,交集5中的距離2600適用於交集3,而不是交集4。您從索引0而不是1開始。

有關C中Dijkstra算法的信息,請參見以下內容: http : //www.c-program-example.com/2011/10/c-program-to-solve-dijkstras-algorithm.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM