Java中的最短路径实现

时间:2013-11-28 06:19:47

标签: java graph graph-algorithm shortest-path

我正在使用Adjacency矩阵并尝试创建一个在图中找到最短路径的函数。我正在尝试修改我用来编写最小生成树函数的Prim算法。

public static int shortest(int first, int last)  throws Exception{
              int weight[] = new int[Nodes.length]; //keeps track of the weights of the added edges
              int path[] = new int[Nodes.length];   //keeps track of the nodes in the path
              boolean visited[] = new boolean[Nodes.length];    //keeps track of nodes visited
              int current;
              int total;
              int minWeight;
              int nodes = Nodes.length;
              int i;

              for (i=0;i<nodes;i++){    //initialization
                    path[i]=0;
                    visited[i]=false;
                    weight[i]=32767;    //largest short int
              }

              current=first;
              weight[current]=0;
              total=1;
              visited[current]=true;
              path[0]=current;

              while(total!=nodes){
                    for(i=1;i<nodes;i++){
                        if(AMatrix[current][i] != 0 && visited[i]==false && weight[i]>AMatrix[current][i]){     
                                weight[i]=AMatrix[current][i]; 
                                    path[i]=current;
                        }
                    }
                    minWeight=32767;
                    for(i=1;i<nodes;i++){
                        if(visited[i]==false && weight[i]<minWeight){
                            minWeight=weight[i];
                            current=i;
                        }
                    }
                    write("current = "+ current);
                    visited[current]=true;
                    total++;

                    if(current == last){
                        path[total-1]=current;
                        for(i=1;i<total;i++){
                            write("includes the node "+Nodes[path[i]]); 
                        }

                        minWeight=0;
                        int j=1;
                        for(i=2;i<total;i++){
                            write("The weight from "+Nodes[path[j]]+" to "+Nodes[path[i]]+" is "+AMatrix[path[j]][path[i]]);
                            minWeight = minWeight+AMatrix[path[j]][path[i]];
                            write("min weight= "+minWeight);
                            j++;
                        }
                        return minWeight;
                    }
                }

                return -1;
        }

它适用于我从第一个节点开始的输入之一,但如果我尝试从另一个节点开始,它会创建一个连接两个实际未连接的节点的路径。我盯着这看了这么久,我不明白为什么会这样做。最小的生成树工作得很好,我认为这将是一个简单的修改,但它只是不起作用。

我实际上认为这有很多问题,例如,如果我尝试打印从0开始路径数组的元素,它将打印出第一个两次,所以我确定我已经犯了很多错误,但那就是现在对我来说显而易见的错误。

AMatrix是我的邻接矩阵,节点是我每个节点的矩阵。 Write是我编写的写入输出文件的函数。

1 个答案:

答案 0 :(得分:1)

数组具有零基索引。但是你的前两个循环从1开始:

  

for(i = 1; i&lt; nodes; i ++)

因此,这可能会导致它在您启动first=0时起作用,因为在您的邻接矩阵AMatrix[current][i] != 0中,对角线(当前== i)可能为0.但是如果您启动算法如果其他值为0,则表示缺少节点:0。

另外,只是一些提示:

  • 你说:“weight [i] = 32767; //最大的short int”,但这是最大的短片,2 ^ 15 - 1,最好这样初始化:{{ 1}}。如果你想要最大的int,它是类似的:weight[i] = Short.MAX_VALUE;
  • 最好不要将静电用于一切。测试并不容易,也不是OO。您可以使用JUnit编写单元测试。或者像Domi在评论中所说,尝试调试你的代码(例如使用eclipse调试器)。
  • 如果您没有自己编写代码,则代码有点难以理解/理解。所以添加注释,例如每个上面的注释,解释它的作用。代码的可读性比快速编写更重要,因为您将多次读取代码,但只编写一次。