문제
https://www.acmicpc.net/problem/11403
풀이(7분)
import java.io.*;
import java.util.*;
public class Main {
static int n;
static boolean[][] floyd;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine()); // 정점의 개수
floyd = new boolean[n+1][n+1]; // 인덱스를 편리하게 사용하기 위해 +1
for(int i = 1; i <= n; i++){
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= n; j++){
int check = Integer.parseInt(st.nextToken());
if(check == 1){ // 경로가 존재하는 경우
floyd[i][j] = true;
}
}
}
floyd(); // 플로이드-와샬 알고리즘
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) {
if(floyd[i][j]){
sb.append("1").append(" ");
}else{
sb.append("0").append(" ");
}
}
sb.append("\n");
}
System.out.println(sb);
}
static void floyd(){
for(int k = 1; k<= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
floyd[i][j] = (floyd[i][j] || (floyd[i][k] && floyd[k][j])) ? true : false; // 원래 갈 수 있거나, 거쳐가는 것이 가능한 경우
}
}
}
}
}
문제 풀이 전략
플로이드-와샬 알고리즘의 하위 버전 문제라고 생각한다.
여기서 중요한 것은 n = 100이 최대라는 것을 인식하여 3중 포문을 사용해도 10^6 = 1_000_000으로 충분한 연산이 가능하다는 것이다.
그것만 깨달았다면 모든 좌표에 대해 두 가지를 확인해 주면 된다.
i -> j로 갈 때, 기존의 i -> j가 존재하는지 or i -> k -> j로 거쳐가는 경로가 존재하는지이다.
for 반복문을 보면 1번 정점에서 1~n 정점까지 1~n을 거쳐가는 경로가 모두 확인되게 된다.
더욱 추가적인 문제를 원한다면
2025.04.01 - [문제 풀이/도구정리] - [도구정리] 플로이드-와샬(Floyd-Warshall) 알고리즘
[도구정리] 플로이드-와샬(Floyd-Warshall) 알고리즘
플로이드-와샬 알고리즘이란?플로이드-와샬(Folyd-Warshall) 알고리즘그래프의 최단 경로를 구하는 알고리즘 중 하나모든 정점들 간의 최단 거리를 구함(테이블을 채운다고 볼 수 있음)음수 사이클
to-travel-coding.tistory.com
알고리즘을 참고하자.
또한, 백준 10404 문제도 꼭 풀어보자!
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 3980번. 선발 명단(JAVA) (0) | 2025.04.04 |
---|---|
[백준] 2610번. 회의준비(JAVA) (1) | 2025.04.02 |
[백준] 11404번. 플로이드(JAVA) (0) | 2025.04.01 |
[백준] 1956번. 운동(JAVA) (0) | 2025.04.01 |
[백준] 1563번. 개근상(JAVA) (0) | 2025.04.01 |