2013-08-03 95 views
0

這是我的,我創建找到兩個村莊之間的最短路徑方法的代碼。問題在於while循環永遠不會結束,因爲if語句中的條件從不出現if(alt < villageCost[v])。請幫我弄清楚爲什麼!實現方法找到最短路徑(Dijkstra算法)的被陷在環路

public ArrayList<Village> shortestPath(Village s, Village d){ 
    int[] villageCosts= new int[villages.size()]; 
    boolean[] wasVisited= new boolean[villages.size()]; 
    shortestPath = new ArrayList<Village>(); 
    int counter= wasVisited.length; 

    for(int i=0; i<villageCosts.length; i++){ //initialize to infinity 
     villageCosts[i]= Integer.MAX_VALUE; 
    } 

    villageCosts[s.getVillageName()] = 0; 
    System.out.println("This is the counter before the while loop: " +counter); 
    while(counter > 0){ 
      int mincost = Integer.MAX_VALUE; 
      int minindex= 0; 

     //if the minimum cost in villageCosts i still infinity 
     for(int i=0; i<villageCosts.length && wasVisited[i]==false; i++){ 
      if (mincost < villageCosts[i]){ 
       mincost = villageCosts[i]; 
       minindex= i; 
       wasVisited[i]= true; 
       counter--; 
       } 
      shortestPath.add(villages.get(i)); 
      } 

     if minimum cost in villegeCost is still infinity 
     if(villageCosts[minindex] == Integer.MAX_VALUE){ 
      System.out.println("No path exists."); 
      return null; 
      } 

    ArrayList<Road> connectingToMinIndex= villages.get(minindex).getConnectingRoads(); 
for(int i=0; i< connectingToMinIndex.size(); i++){ //roads connecting min index village 
for(int j=0; j < villages.get(minindex).getConnectingRoads().size(); j++){ 
for (int k = 0; k < villages.get(i).adjVillages.size(); k++){ 
     int v= villages.get(i).adjVillages.get(k).getVillageName(); 
     int alt= villageCosts[minindex] + villageCosts[i]; 
      if (alt < villageCosts[v]){ 
       villageCosts[v] = alt; 
       wasVisited[v]= true; 
       counter--; 
      } shortestPath.add(villages.get(alt)); 
        } 
       } 
      } 
     } //ends while loop 
     return shortestPath; 
    } 
+1

啊。那麼這必須是最長的路徑算法。 –

+0

根據你的代碼,'s.getVillageName()'返回一個int?這是真的?這是非常具有誤導性的。 – supersam654

+1

根據您的發佈代碼,源和圖參數沒有區別。兩個論點都是一樣的(村莊),沒有村莊。此外在村莊[s.getVillageName()] = 0; 您應該使用源名稱將其成本設置爲零。 –

回答

0

要進行調試,請對while循環迭代次數設置限制。然後在while循環內部使用System.out.print,在每次迭代時打印每個變量的值。在設定的迭代次數完成後,檢查打印到屏幕上的結果。這是調試循環的最佳方式。

1

這永遠不會爲真:

if (mincost < villageCosts[i]){ 

,因爲你初始化所有的villageCosts項目,以Integer.MAX_VALUE(然後改變當前以0)和初始化mincost類似:

int mincost = Integer.MAX_VALUE;