익스트라 --Python 최단 경로 문제를 달성

# 최단 경로 알고리즘 다 익스트라
# 입력 : 가중 유향 그래프 G = (V, E)가 V = {1,2,3 ... N}
# 출력 : G 최단 거리의 각 정점에 1 개 정점
 
데이크 스트라 알고리즘 무게 각 지점의 변경 :

 

. 1  정점 :
 2 개      # 정점 클래스 
. 3      DEF  __init__ (자기, VID, OutList)
 . 4          self.vid VID =   # 에지 
5.          self.outList OutList =   # 가장자리 ID 관한 꼭지점리스트는 인접리스트는 다음과 같이 이해 될 수있다 
. 6          self.know가 FALSE =    #의 디폴트는 거짓이다 
. 7          self.dist = 플로트 ( " INF " )     #의 S 점까지의 거리가, 디폴트는 무한대 
. 8          self.prev 0 =    #는 디폴트 0 정점 ID이다 
. 9      DEF  __eq__ (셀프, 기타) :
 10          IFisinstance. (다른 자기 __class__ )
 11              리턴 self.vid ==는 other.vid
 12          다른 :
 13              반환 거짓
 14      DEF  __hash__ (자기)
 15          리턴 해시 (self.vid)
1  #는 정점 객체를 만들 
2 = 정점 (1, 2,3 V1 ])
 . 3 V2 = 정점 (2, [3,4 ]을)
 . (4) V3 = 정점 (. 3 [. 5 ])
 . 5 V4 = 정점 (. 4 [ 3,5,6 ])
 . 6 V5 정점 = (. 5 [. 6 ])
 . (7) V6 = 정점 (. 6 , [])
 . (8)  
. 9  # 가중치 저장 에지 
(10) 가장자리 = 딕셔너리 ()
 . 11  DEF 용 의 add_edge 부재 (앞, 뒤, 값) :
 12 인      가장자리 [(전면, 후면) = (13) 의 add_edge 부재 (1,2,1 )
 (14) 의 add_edge 부재 (1,3,12 )
 15 의 add_edge 부재 (2,3,9 )
16 의 add_edge (2,4,3 )
 17 의 add_edge (3,5,5 )
 18 의 add_edge (4,3,4 )
 19 의 add_edge (4,5,13 )
 20 의 add_edge (4,6,15 )
 21 세 의 add_edge (5, 6,4)
1  # 1 0 인덱스 요소가 존재하지 않는 저장 정점 길이 7의 배열 생성 
2 VLIST = [FALSE, V1, V2, V3, V4, V5, V6]
 . 3  #의 차로 인해 설정, 사용하는 대신 우선 순위 큐 세트를 선택 설정 제거하는 편리한 방법이있다 
. (4) VSET 세트 = ([V1, V2, V3, V4, V5, V6])
. 1  DEF의 get_unknown_min () : # 이 함수 대신 우선 순위 큐 디큐으로 사용되는 
2      the_min = 0
 (3).      the_index = 0
 (4).      J = 0
 (5).      위한 I  범위 (1. 렌 (VLIST))
 . 6          IF (VLIST [I] .know는 IS )는 true
 . 7              계속 
8.          다른 :
 . 9              IF (J의 == 0) :
 10                  the_min = VLIST [I] .dist
 . 11                  = the_index I
 12은              다른 :
 13 인                  경우는(VLIST [I] .dist < the_min)
 14                      the_min = VLIST [I]를 .dist
 15                      the_index를 = I                    
 (16)              . J + = 1
 . 17      # 시간이 밝혀졌다 미지의 최소 요소 
(18)는      vset.remove은 (VLIST [ the_index]) #의 의견 동작 구현 팀 등가 
19       VLIST [the_index]
1  DEF 주 () :
 2      # 将V1设为顶点
3      v1.dist = 0
 4  
5      동안 (LEN (Vset으로)! = 0) :
 6          V = get_unknown_min ()
 7          인쇄 (v.vid, 수직 거리, V .outList)
 8          v.know = 9           v.outList : # 索引为w 
(10)가              있는 경우 (VLIST [w] .know가 있다 )가 true :
 11                  계속 
12              의 경우 (VLIST [w] == .dist 플로트 ( ' INF ' )) :
 13                 VLIST [W] + = 수직 거리 .dist 가장자리 [(v.vid, W)]
 14                  VLIST [W] = .prev v.vid
 15              밖의 :
 16                  IF ((+ 수직 거리 가장자리 [(v.vid, W)]) < VLIST [W] .dist)
 . 17                      VLIST [W] + = 수직 거리 .dist 가장자리 [(v.vid, W)]을
 18 인                      VLIST [W] = .prev v.vid
 19.                  밖의 : # 원래 경로 길이는 업데이트 할 필요가 없습니다, 작은 
20 개                      패스

함수 호출 :

. (1)  주 ()
 (2)  인쇄 ( " 수직 거리가 출발지로부터 최단 경로 길이 : ' )
 3.  인쇄 ( " v1.prev : ' , v1.prev, ' v1.dist ' , v1.dist)
 . (4)  전단 ( ' v2.prev : ' , v2.prev, ' v2.dist ' , v2.dist)
 5.  인쇄 ( " v3.prev : ' , v3.prev, ' v3.dist ' , v3.dist)
 . 6  프린트 ( ' v4.prev : ' , v4.prev, 'v4.dist ' , v4.dist)
 7  인쇄 ( ' v5.prev : ' , v5.prev, ' v5.dist ' , v5.dist)
 8  인쇄 ( ' v6.prev : ' , v6.prev, ' V6. DIST ' , v6.dist)

결과 :

1 0 [2, 3 ]
 (2) (1) [3, 4 ]
 (4) 4- [3, 5, 6 ]
 3 8 5 ]
 5 13 [6 ]
 6 17 []
즉 시작 지점에서 가장 짧은 경로 길이에 수직 거리 :
v1.prev : 0 v1.dist 0
v2.prev : 1 v2.dist 1 
v3.prev : 4 v3.dist 8 
v4.prev : 2 v4.dist 4 
v5.prev : 3 v5.dist 13 
v6.prev : 5 v6.dist 17

 

 

 

 

 

추천

출처www.cnblogs.com/aiyou-3344520/p/11696115.html