簡體   English   中英

Dijkstra的算法Java-距離不正確

[英]Dijkstra's Algorithm Java— Distance not right

我正在嘗試對dijkstra的算法進行編碼,從我需要顯示距離並打印節點路徑的任何頂點開始。 它適用於2,4和5頂點,但對於1和3卻很混亂。 它可能很小,但我看不到。

public static void main(String[] args)
{
    int INF = Integer.MAX_VALUE;
    int verticies = 5;
    int W[][] = {{INF,7,4,6,1},
    {0,INF,0,0,0},
    {0,2,INF,4,0},
    {0,0,0,INF,0},
    {0,0,0,1,INF}};

    int startNode = 1;
    dijkstra(W,verticies,startNode-1);

}

public static void dijkstra(int G[][],int n,int startnode)
{
    int INF = Integer.MAX_VALUE, nINF = Integer.MIN_VALUE;
    //int cost[MAX][MAX],distance[MAX],pred[MAX];
    //int visited[MAX],count,mindistance,nextnode,i,j;
    int cost[][] = new int[n][n];
    int distance[] = new int[n];
    int pred[] = new int[n];
    boolean visited[] = new boolean[n];
    int count=0, mindistance=0, nextnode=0,i,j;

    //pred[] stores the predecessor of each node
    //count gives the number of nodes seen so far
    //create the cost matrix
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(G[i][j]==0)
                cost[i][j]=INF;
            else
                cost[i][j]=G[i][j];

    //initialize pred[],distance[] and visited[]
    for(i=0;i<n;i++)
    {
        distance[i]=cost[startnode][i];
        pred[i]=startnode;
        visited[i]=false;
    }

    distance[startnode]=0;
    visited[startnode]=true;
    count=1;

    while(count<n-1)
    {
        mindistance=INF;

        //nextnode gives the node at minimum distance
        for(i=0;i<n;i++)
            if(distance[i]<mindistance&&!visited[i])
            {
                mindistance=distance[i];
                nextnode=i;
            }

        //check if a better path exists through nextnode
        visited[nextnode]=true;
        for(i=0;i<n;i++)
            if(!visited[i])
                if(mindistance+cost[nextnode][i]<distance[i])
                {
                    distance[i]=mindistance+cost[nextnode][i];
                    pred[i]=nextnode;
                }
        count++;
    }

    //print the path and distance of each node
    for(i=0;i<n;i++)
        if(i!=startnode)
        {
            if(distance[i] == INF || distance[i] < 0){
                System.out.print("\nNo edge exists between node "+(startnode+1)+" and node "+(i+1));
            } else {
                System.out.format("\nDistance of node %d = %d", (i + 1), distance[i]);
                System.out.format("\nPath = %d", (i + 1));

                j = i;
                do {
                    j = pred[j];
                    System.out.format("<-%d", (j + 1));
                } while (j != startnode);
            }
        }
}

我不知道具體如何,但是您正在以某種方式使INF進入您的計算。 我懷疑distance[i]=mindistance+cost[nextnode][i]; ,但可能不是唯一的罪魁禍首,我尚未檢查。 mindistance為1(或更大)並且成本為Integer.MAX_VALUE ,您將發生算術溢出,並且結果將為負。 進一步的行為,我沒有預料到,但是沒有達到預期。

在兩個地方定義INF我將值更改為1,000,000,我從您的程序中獲得以下輸出:

Distance of node 2 = 6
Path = 2<-3<-1
Distance of node 3 = 4
Path = 3<-1
Distance of node 4 = 2
Path = 4<-5<-1
Distance of node 5 = 1
Path = 5<-1

我相信這是正確的。

我發現的方式? 我將此語句粘貼到外部while循環的中間:

        System.out.println("count " + count + " nextnode " + nextnode + " mindistance " + mindistance);

當它打印出很大的負數時,我開始懷疑算術溢出。 在您學會使用調試器之前, System.out.println()是您進行調試的朋友。

暫無
暫無

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

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