일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- enumasByue
- C++
- 델리게이트
- 정렬
- UELOG
- unorder_map
- 알고리즘
- 언리얼가비지컬렉터
- BFS
- 스마트포인터
- C++최적화
- UML관련
- 람다사용정렬
- 애셋로드
- map
- 람다
- stl
- 선택정렬
- 강참조
- 약참조
- 정렬알고리즘
- moreeffectiveC++
- 데이터애셋
- 자료구조
- UE_LOG
- 크리티컬섹션
- 프로그래머스
- UE4 커스텀로그
- dataasset
- 언리얼엔진구조체
- Today
- Total
기억을 위한 기록들
[알고리즘] 최단 경로찾기 ? 다익스트라 알고리즘 (Dijkstra Algorithm) 본문
다익스트라 알고리즘은 프림 알고리즘 과 동작방식이 비슷하다. 다만 프림알고리즘은 단순히 간선의 길이를 이용해 어떤 간선을 먼저 연결할지 결정하는데 반해, 다익스트라 알고리즘은 '경로의 길이'를 감안해서 간선을 연결한다.
다익스트라의 최단 경로 탐색 알고리즘은 사이클이 없는 방향성 그래프에 한해서만 사용 가능.
동작 방식
1. 각 정점 위에 시작점으로부터 자신에게 이르는 경로의 길이를 저장할 곳을 준비하고 모든 정점 위에 있는 경로의 길이를 무한대로 초기화한다.
2. 시작 정점의 경로 길이를 0으로 초기화 하고(시작에서 시작까지는 0이므로), 최단 경로에 추가한다.
3. 최단 경로에 새로 추가된 정점의 인접 정점들에 대해 경로 길이를 갱신하고 이들을 최단 경로에 추가.
만약 추가하려는 인접 정점이 이미 최단 경로 안에 존재한다면 갱신되기 이전의 경로 길이가 새로운 경로의 길이보다 더 큰 경우, 다른 선행 정점을 지나던 기존의 경로를 현해 정점을 경유 하도록 수정.
4. 그래프 내의 모든 정점이 최단 경로에 소속될때까지 3번 과정 반복
예제
B에서부터 시작한다. B의 가중치 비용은 0이다. 주변에 있는 정점 A/C/F 간선의 비용을 해당 정점들에 저장해준다.
그리고 각각으 정점들에 있는 주변의 정점에 본인이 가지고 있던 비용을 추가로 더 해준다.
B-A까지 35였으므로 A에서 E까지 이르는 비용 247을 더한 282를 E정점에 저장해주고,
B-C으로 있던 가중치 값에 B-C-D를 모두 더 하여 243, B-C-G는 220으로 저장해준다.
다음으로 정점 F에 인접한 정점들을 살펴보면 기존 B-A-E로 저장 되있던 282보다 B-F-E의 값은 150+82로 232이다.
기존 값보다 낮은 가중치 값으로 연결이 가능함으로 기존 경로 B-A-E는 폐기하고, 새 경로 길이를 232를 E에 저장해준다.
마찬가지로 B-C-G의 값 346보다 B-F-G의 가중치 값이 304로 더 낮으므로 기존 경로는 폐기하고 새로운 경로를 G에 저장해준다.
나머지 경로를 마찬가지로 계산해주고
최단 경로 탐색이 끝이 났다. B에서부터 해당 정점에 이르는 경로상에 있는 모든 간선들의 가중치를 합한것이다.
참고용
blog.naver.com/ndb796/221234424646
'자 & 알 > 알고리즘' 카테고리의 다른 글
[알고리즘] 백트래킹 알고리즘 (0) | 2021.02.02 |
---|---|
[알고리즘] 최소 신장 트리(MST:Minimum Spanning Tree)란? (0) | 2021.01.27 |
[알고리즘]크루스칼 알고리즘(Kruskal's Algorithm) (0) | 2021.01.27 |
[알고리즘]프림 알고리즘(Prim'a Algorithm) (0) | 2021.01.27 |
[알고리즘] 플러드 필(Flood Fill) 알고리즘? (0) | 2021.01.11 |