[BOJ_11403 | Floyd] 경로 찾기
2019. 1. 19. 17:27ㆍComputer Science/Problem Solving (PS)
풀이
플로이드 와샬 알고리즘을 이용해서 각 점의 경로 여부를 확인하면 간단하게 해결할 수 있는 문제였다.
플로이드 와샬 알고리즘이란 그래프에서 모든 꼭짓점 사이의 최단 경로의 거리를 구하는 알고리즘으로,
Kruscal, Prim알고리즘과는 달리 음수 가중치를 갖는 간선도 순환만 없다면 잘 처리할 수 있다는 장점이 있다.
하지만, 반복문을 3번 돌리기 때문에 O(n^3)의 시간복잡도를 가지므로 이 점은 유의해야 한다.
3개의 반복문은 각각 다음과 같다.
첫 번째 - 거쳐가는 점
두 번째 - 출발하는 점
세 번째 - 도착하는 점
위 문제는 경로가 있는지 유무만 판단하는 것이므로 초기값을 100이상의 값으로 설정하고
플로이드 와샬 알고리즘을 수행하여 거리를 저장한 배열의 값이 100 이상이면
경로가 없는 것으로 간주하면 쉽게 해결할 수 있다.
소스 코드
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 31 32 | import java.util.*; public class BOJ_11403 { public static void main(String[] args){ Scanner input = new Scanner(System.in); int n = input.nextInt(); int[][] dis = new int[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int k = input.nextInt(); if(k == 0) dis[i][j] = 1000; else dis[i][j] = k; } } //Floyd & Washall's for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(dis[i][j] > dis[i][k]+dis[k][j]) dis[i][j] = dis[i][k]+dis[k][j]; } } } //print for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(dis[i][j] < 1000) System.out.print(1+" "); else System.out.print(0+" "); }System.out.println(); } } } | cs |
반응형
'Computer Science > Problem Solving (PS)' 카테고리의 다른 글
[BOJ_10159 | Floyd]저울 (0) | 2019.01.20 |
---|---|
[BOJ_1389 | Floyd]케빈 베이컨의 6단계 법칙 (0) | 2019.01.19 |
[BOJ_11586 | Array] 지영 공주님의 마법 거울 (0) | 2019.01.07 |
[BOJ_11650 | compareTo] 좌표 정렬하기 (0) | 2019.01.05 |
[BOJ_1181 | compareTo] 단어 정렬 (0) | 2019.01.03 |