2024. 3. 8. 10:48ㆍ알고리즘
플로이드 워셜이란?
최단 경로 담색 알고리즘 중 하나이다.
음수 사이클이 없는 경우에 사용할 수 있다.
모든 정점 간에 최단 경로를 구할 때 사용된다.
시간 복잡도 : Θ(N^3)
사용법
정점의 개수가 3개, 2를 거치는 경우
일단 N x N 예시의 경우는 3 x 3의 배열을 선언해주고 모든 칸을 매우 큰 값으로 초기화해준다.
1. 정점 1에서 시작하여 2를 거쳐 3에 도달하는 경로를 구한다
dist[1][3] = MIN(dist[1][3],dist[1][2]+dist[2][3])
2. 정점 1에서 시작하여 2를 거쳐 4에 도달하는 경로를 구한다
dist[1][4] = MIN(dist[1][4],dist[1][2]+dist[2][4])
3. 정점 3에서 시작하여 2를 거쳐 1에 도달하는 경로를 구한다
dist[3][1] = MIN(dist[3][1],dist[3][2]+dist[2][1])
4. 정점 3에서 시작하여 2를 거쳐 4에 도달하는 경로를 구한다
dist[3][4] = MIN(dist[3][4],dist[3][2]+dist[2][4])
5. 정점 4에서 시작하여 2를 거쳐 1에 도달하는 경로를 구한다
dist[4][1] = MIN(dist[4][2],dist[4][2]+dist[2][1])
6. 정점 4에서 시작하여 2를 거쳐 3에 도달하는 경로를 구한다
dist[4][3] = MIN(dist[4][3],dist[4][2]+dist[2][3])
이러한 방식으로 1을 거치는 경우, 2를 거치는 경우, 3을 거치는 경우, 4를 거치는 경우를 구해준다.
코드
i가 출발 정점, k가 도착 정점이며 j가 거치는 정점이다
for(int j=1;j<=N;j++){
for(int i=1;i<=N;i++){
for(int k=1;k<=N;k++){
if(list[i][j]==Integer.MAX_VALUE||list[j][k]==Integer.MAX_VALUE||i==k) continue;
list[i][k]=Math.min(list[i][j]+list[j][k],list[i][k]);
}
}
}
'알고리즘' 카테고리의 다른 글
의상(프로그래머스 Lv_2) (0) | 2023.06.26 |
---|---|
전화번호목록(프로그래머스_Lv2) (1) | 2023.06.09 |
폰켓몬(프로그래머스_Lv1) (0) | 2023.05.29 |
개인정보 수집 유효기간(프로그래머스_Lv1) (0) | 2023.05.28 |