# 최단 경로 알고리즘 다 익스트라
# 입력 : 가중 유향 그래프 G = (V, E)가 V = {1,2,3 ... N}
# 출력 : G 최단 거리의 각 정점에 1 개 정점
데이크 스트라 알고리즘 무게 각 지점의 변경 :
![](https://img2018.cnblogs.com/blog/1839005/201910/1839005-20191018013225655-121005565.jpg)
. 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