두 마을 간의 최단 경로를 찾기 위해 만든 방법에 대한 코드입니다. 문제는 if 문의 조건이 if(alt < villageCost[v])
이 결코 발생하지 않기 때문에 while 루프가 끝나지 않는다는 것입니다. 이유를 알아내는 데 도움주세요!루프에서 걸리는 최단 경로 (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;
}
아. 그러면 가장 긴 경로 알고리즘이어야합니다. –
코드에 따르면's.getVillageName()'은 int를 반환합니까? 사실입니까? 오해의 소지가 있습니다. – supersam654
게시 된 코드에 따르면 소스 및 그래프 인수에는 차이가 없습니다. 두 가지 주장은 모두 동일하며 (마을) 마을이 없습니다. 또한 villageCosts [s.getVillageName()] = 0; 소스 이름을 사용하여 비용을 0으로 설정해야합니다. –