그림 - 최단 경로 문제

  최단 경로의 정점의 나머지 소스 관점에서

다 익스트라 (Dijkstra 프로그램) 알고리즘

다 익스트라 알고리즘은 최단 경로의 경로 길이 결과에 따른 오름차순이다. (마이너스 원 잘못된 알고리즘)

알고리즘 설명 :

  1. <VI, VJ> 존재하지 않는 경우, 호 [I] [J] 가중 유향 그래프 가중치 인접 행렬 호, 호 [I]는 [j]가 아크 <VI, VJ>의 무게로 표시한다고 가정 ] S는 처음에 비어 밝혀졌다 최단 경로의 시작 단부에서 정점 (V0)의 집합이고, ∞이다.
  2. V0은 VS가 편성 된 <V0, VJ> 첨가 VJ 버텍스 S. 가장 짧은 경로를 선택
  3. VJ는 S, 최단 경로 변경은 VS 수정 V0 최단 경로에 추가하기 때문에
  4. 반복은, 최단 경로가 순차적으로 증가하는 시퀀스 나머지 꼭지점에 V0로부터 얻어진 수치 2,3- N-1 번 단계

이 알고리즘은 마지막으로 증분 최단 경로 순서를 얻을 수있다, 각각의 사이클은 나머지 최단 경로를 찾은 다음 최소의 선택 뒤에 선택 정렬과 같은 같은 때마다, 최단 경로의 나머지 부분에 대한 업데이트하는 것입니다 도 정점에서 최단 경로의 각각에 소스 인 순서 시퀀스의 앞단에.

/ *
    G.arcs : 가중 인접 행렬
    VO : 소스
    P : 매트릭스 스토리지 경로
    D : V0의 최단 경로의 길이를 저장하는 VI의 
* / 
무효 shortestPath_DLJ (MGraph G, INT의 V0, PathMatrix & P, ShortPathTable & D) {
     / *
        나머지 정점 V0 정점 P V의 가장 짧은 경로에서 요청 [V], 우측 길이 D와 [V]
        P [V] (W)가 전류를 최단 경로 V의 정점 V0에서 결정된다는 사실이다 [W]
        
        최종 [V]를 최단 경로로 V V0로부터 획득 한 사실이며,
        곧 정점 V의 S 농축에 추가됩니다 
    * /  
    // 초기화 
     (V = 0 , V <G.vexnum; V ++ ) {
        파이널 [V] = 거짓 ;
        
        // V에 V0이 경우 아크 D에 할당된다 [V] 중량 달리 무한대
         // G.arcs INFINITY의 값과 두 개의 호에는 정점하지 
        D [V] = G.arcs [ V0 [V];
        
        // 블랭킹 경로 
         (W = 0 ; W <G.vexnum; W ++) P [V] [W] = flase;
        
        // D는 [V] 값 INFINTY 미만이면, V, V0에 V0가 기재된 아크는 V 경로 NATURAL 
        IF (D는 [V] <INFINTY) {P는 [V] [V0] =  ; P을 [V] V] = ;}
    }
    
    // 초기화, 집합 S에 속하는 V0 
    D [V0] = 0 ; 최종 [V0]는 = ;
    
    // 메인 루프를 시작 각 계산 최단 경로 V로 V0을 정점 V는 집합 S에 추가
     // G.vexnum 휴식 - 1 개 정점 
     (I을 = . 1 , I는 G.vexnum를 <; I는 ++ ) {
         / / V0에서 현재 최단 거리 
        분 = INFINTY;
        
         (W = 0 ; W <G.vexnum; W ++ ) 
             // 정점 VS에서 
            IF {V = W; 분 = (! 최종 [V]) D [W]}
        
        // 발견 상기 V는 S 세트에 추가되어 
        최종 [V]가 = ;
        
        / *     최단 거리를 업데이트
            V로 설정된 S에 첨가하고, 새로운 경로는 정점 v를 생성
            최단 경로를 찾기 위해 옆에있는 최단 경로를 다시하는 것은-결정 
        * /  
         (w = 0 , w <G.vexnum; ++ w )
             의 경우 (최종 [w] && 분 G.arcs + [V] [w] <! {D [w])
                D [W] = 분 + G.arcs [V] [W];
                 // V에 V0 경로, P는 [V] P [W]에 할당 
                 // W 경로에있는 
                P [W] = P [ V];
                P [w] [w] = ;
            } 
    }    
}

계속합니다. . .

 

추천

출처www.cnblogs.com/haiyuexiaozu/p/11634853.html