2017-11-04 1 views
1

그래프의 두 꼭지점 사이의 최단 경로를 반환하려고합니다. breadthFirstSearch를 찾기 위해 작성된 코드가 있지만 최단 경로를 반환하도록 수정하는 방법을 모르겠습니다. 아래는 내 breadthFirstSearch 함수입니다.ShortestPath with BFS (BreadthFirstSearch)

private void breadthFirstSearch(T start,T end){ 

    Queue<T> queue = new LinkedList<>(); 
    Set<T> visited = new HashSet<>(); 
    visited.add(start); 
    queue.add(start); 
    while(!queue.isEmpty()){ 
     T v = queue.poll(); 
      for(int i =0;i<this.keyToVertex.get(v).successors.size();i++){     if(visited.contains(this.keyToVertex.get(v).successors.get(i).key)){ 
       continue; 
      } 
      visited.add(this.keyToVertex.get(v).successors.get(i).key); 
      queue.add(this.keyToVertex.get(v).successors.get(i).key); 
     } 

    }  

} 

어떻게 최단 경로를 반환하도록 수정할 수 있습니까?

답변

1

확인할 값뿐만 아니라 해당 값으로 이어지는 경로 이상의 내용을 Queue에서 추적해야합니다. 따라서 유형은 Queue<T> 이상이어야하지만 예를 들어 Queue<LinkedList<T>>이어야합니다.

대기열의 첫 번째 값은 싱글 톤 목록start이고 start이 아니어야합니다.

대기열의 값을 처리 할 때 방문중인 정점은 대기열 항목의 마지막 요소가되며 항목을 대기열에 추가하면 현재 항목의 복제본이됩니다. 다음 이웃이 추가되었습니다. 이 같은

뭔가 : 덕분에 많은 도움이

Queue<LinkedList<T>> queue = new LinkedList<>(); 
queue.add(new LinkedList<>(Collections.singleton(start))); 

while (!queue.isEmpty()) { 
    LinkedList<T> path = queue.poll(); 
    T v = path.getLast(); 
    if (v.equals(end)) { 
     return path; 
    } 

    for (int i = 0; i < this.keyToVertex.get(v).successors.size(); i++) { 
     T v2 = this.keyToVertex.get(v).successors.get(i).key; 
     if (visited.contains(v2)) { 
      continue; 
     } 

     LinkedList<T> path2 = new LinkedList<>(path); 
     path2.add(v2); 
     queue.add(path2); 
     visited.add(v2); 
    } 
} 
+0

! 나중에 참조 할 수 있도록 LinkedList의 첫 번째 요소를 최종 꼭지점과 비교하기 때문에 첫 번째 요소가 아닌 LinkedList의 마지막 요소를 가져 오려고합니다. – Hussein

+0

@Hussein 나는'getLast()'대신'peek()'을 사용했다는 것을 의미한다고 생각한다. 나는'peek()'이 마지막으로 (문서를 점검하지 않고) 리턴 할 것이라는 인상을 받았다. 분명히 틀렸다. 지적 해 주셔서 고맙습니다. – janos