>  Q&A  >  본문

BFS 알고리즘을 사용하여 그래프를 탐색하고 최단 경로를 출력합니다.

<p>이 프로그램의 목표는 다양한 공항을 통과하고 너비 우선 검색 알고리즘을 사용하여 PHX와 BKK 사이의 최단 경로를 출력하는 것입니다. <strong>하지만 결과를 인쇄하는 데 문제가 있습니다. </strong></p> <p>예상되는 출력(최단 경로)은 다음과 같습니다. PHX -> LAX -> BKK</p> <pre class="brush:php;toolbar:false;">const Airports = 'PHX BKK OKC JFK LAX MEX EZE HEL LOS LAP LIM'.split(' '); const 경로 = [ ['PHX', 'LAX'], ['PHX', 'JFK'], ['JFK', 'OKC'], ['JFK', '헬'], ['JFK', 'LOS'], ['MEX', 'LAX'], ['MEX', 'BKK'], ['멕스', '임'], ['MEX', 'EZE'], ['임', 'BKK'], ]; //그래프 const adjacencyList = new Map(); //노드 추가 함수 addNode(공항) { adjacencyList.set(공항, []); } // 방향이 지정되지 않은 가장자리 추가 function addEdge(출발지, 목적지) { adjacencyList.get(origin).push(destination); adjacencyList.get(destination).push(origin); } // 그래프 생성 Airports.forEach(addNode); // 각 경로를 반복하고 값을 addEdge 함수에 분산시킵니다. Routes.forEach(route => addEdge(...route));</pre> <p>노드를 시작점(사이트)으로 하고 에지를 목적지로 하여 그래프는 방향이 없습니다</p> <pre class="brush:php;toolbar:false;">function bfs(start) { const 방문 = new Set(); Visited.add(start); // 방문 목록에 시작 노드를 추가합니다. const 대기열 = [시작]; while (queue.length > 0) { const Airport = queue.shift(); // 대기열 변경 const 목적지 = adjacencyList.get(airport); for (목적지의 상수 목적지) { if (대상 === 'BKK') { console.log(`BFS가 방콕을 찾았습니다!`) //console.log(경로); } if (!visited.has(목적지)) { 방문.추가(목적지); queue.push(대상); } } } } bfs('PHX')

P粉633075725P粉633075725412일 전610

모든 응답(2)나는 대답할 것이다

  • P粉232793765

    P粉2327937652023-09-04 00:28:48

    InSync의 댓글 제안을 따라 문제를 해결할 수 있었습니다

    bfs() 함수에서 oldpath는 각 노드(부모 노드)가 이동한 경로를 저장하는 데 사용되고 최단 경로는 결과를 저장하는 데 사용됩니다

    으아악 으아악

    새 함수의 기능은 매우 간단합니다. shortestPath에 상위 노드를 추가한 다음 상위 노드의 상위 노드를 찾고(존재하는 경우) 현재 상위 노드가 루트 노드일 때 루프가 종료됩니다. 으아악

    회신하다
    0
  • P粉214176639

    P粉2141766392023-09-04 00:24:58

    노드를 방문한 것으로 표시하는 대신 이 기회를 이용하여 노드를 상위 노드로 표시하세요. 지도를 사용하여 다음을 수행할 수 있습니다.

    • 노드 방문 여부를 나타냅니다
    • 에 도달하기 전의 이전 노드(상위 노드)를 나타냅니다.
    • 큐에서 액세스된 노드의 순서를 유지합니다

    또한 함수에서 전역 변수를 참조하는 것을 피하고 대신 필요한 모든 것을 매개변수로 전달하는 것이 좋습니다.

    으아악

    회신하다
    0
  • 취소회신하다