티스토리 뷰
728x90
설명
그래프 내에 존재하는 두 정점 사이의 최단 경로를 찾는 알고리즘. 모든 정점 쌍에 대한 최단 경로를 계산할 수 있다. 만약 정점의 개수가 n일 경우 n * n크기의 2차원 배열을 생성한 뒤, 각 정점 사이의 거리를 초기화해준다. 이후 그래프 내 모든 정점을 중간 정점으로 사용하여 가능한 경로를 탐색해 나간다. 만약 a에서 b로 가는 경로를 구할 때, 중간 정점을 c라 한다면 a -> c에서 c->b로 가는 경로의 거리와 비교해 최단 거리를 갱신한다. 이 과정을 반복하여 모든 정점 사이의 최단거리를 구한다.
- 시간 복잡도: O(n3)
- 알고리즘 문제에서는 보통 정점의 개수가 약 100 ~ 1000개 정도로 나온다.
예시
- 아래와 같은 그래프의 최단 경로를 구할 경우
- 먼저 거리의 배열을 초기화 한다.
1 | 2 | 3 | 4 | 5 | |
1 | 0 | 1 | INF | INF | INF |
2 | 1 | 0 | INF | 1 | INF |
3 | INF | INF | 0 | 1 | INF |
4 | INF | 1 | 1 | 0 | 1 |
5 | INf | INF | INF | 1 | 0 |
💡자기 자신과의 거리는 0으로 초기화
💡옆 정점까지의 거리를 초기화. 가중치가 없는 경우 위와 같이 표현하지만 만약 경로에 가중치가 있는 경우 가중치로 초기화한다.
💡경로가 존재하지 않는 경우는 무한대(INF) 혹은 아주 큰 값으로 초기화
- 1번 정점을 중간 정점으로 하는 경우, 거리 갱신(변화 없음)
1 | 2 | 3 | 4 | 5 | |
1 | 0 | 1 | INF | INF | INF |
2 | 1 | 0 | INF | 1 | INF |
3 | INF | INF | 0 | 1 | INF |
4 | INF | 1 | 1 | 0 | 1 |
5 | INf | INF | INF | 1 | 0 |
- 2번 정점을 중간 정점으로 하는 경우, 거리 갱신
1 | 2 | 3 | 4 | 5 | |
1 | 0 | 1 | INF | 2 | INF |
2 | 1 | 0 | INF | 1 | INF |
3 | INF | INF | 0 | 1 | INF |
4 | 2 | 1 | 1 | 0 | 1 |
5 | INf | INF | INF | 1 | 0 |
- - 4에서 1로 1에서 4로 가는 경로의 값이 갱신된다.
- 위 과정을 5번 정점까지 반복한다.
구현 (수도 코드)
n: 정점의 개수
dist: 최단 거리를 저장하는 배열
1. dist[i][j]를 무한대 혹은 가능한 정점 사이의 거리의 크기보다 큰 값으로 초기화 해준다.
2. 입력으로 주어지는 그래프 정점 사이의 거리의 값으로 갱신한다.
이때 두 정점 사이의 경로가 여러 개일 경우 거리가 가장 짧은 경로를 저장한다.
2. 모든 정점 k에 대해 아래의 단계를 수행한다:
for k = 1 to n:
for i = 1 to n:
for j = 1 to n:
//정점 `k`를 거쳐가는 경로가 더 짧다면, 그 값을 사용해 `dist[i][j]`를 업데이트한다.
if(dist[i][j] > dist[i][k]+dist[k][j])
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
문제 추천
- 백준 11404번 플로이드
- 백준 1753번 최단 경로
728x90
'알고리즘 > 알고리즘 이론' 카테고리의 다른 글
[알고리즘 이론] 트라이(Trie) 알고리즘 개념 정리 및 문제 추천 (0) | 2025.01.07 |
---|---|
[알고리즘 이론] LIS(가장 긴 부분 수열) (0) | 2024.11.07 |
[알고리즘]크루스칼 알고리즘(kruskal's Algorithm) 정리 및 백준 문제 추천 (0) | 2024.09.04 |
[알고리즘] 정렬(버블, 선택, 삽입) (2) | 2024.01.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 알고리즘이론
- 인프런강의
- SSAFY
- numpy
- 웹개발
- dataframe
- 인프런강의후기
- 인프런
- 코딩테스트
- 티스토리챌린지
- 오블완
- 파이썬
- 웹
- 웹프로그래밍
- 백준알고리즘
- SSAFYcial
- 생성형 AI
- ssafy기자단
- 위니브엠베서더
- django
- 알고리즘
- 백준
- PANDAS
- 더오름
- 위니브
- 제주코딩베이스캠프
- Python
- it도서큐레이션
- 전자회로
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
250x250