1. 링크
- https://www.acmicpc.net/problem/11403
2. 풀이
플로이드 와샬 알고리즘을 이용해서 푼다.
- 단순히 거쳐가는 정점을 반복문 젤 앞에 둔다.
- 2차원 배열이므로 2차원 배열 반복문을 돌리면서 거쳐가는 정점을 모두 확인한다.
- 해당 문제에서는 단순히 양수인 간선 (1) 을 확인하기 때문에 [i~k] [k~j] 가 모두 1이라면 arr[i][j] 도 업데이트한다.
3. 소스코드 (java)
/**
* https://www.acmicpc.net/problem/11403
*/
public class BG_경로찾기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][N];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int k = 0; k < N; k++) { // 거쳐가는 정점을 설정한다.
for(int i = 0; i < N; i++) { // 이 밑에는 단순히 2차원 배열을 돌리기 위함!
for(int j = 0; j < N; j++) {
if(arr[i][k] == 1 && arr[k][j] == 1) {
arr[i][j] = 1;
}
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(arr[i][j] + " ");
}
sb.append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
4. 참고링크
- https://steady-coding.tistory.com/94
'알고리즘 문제 풀기' 카테고리의 다른 글
[백준] 2660 회장찾기 (java) (0) | 2024.10.30 |
---|---|
[백준] 1389 케빈 베이컨의 6단계 법칙 (java) (0) | 2024.10.29 |
[프로그래머스 level 03] - n으로 표현 (c++) (0) | 2020.01.06 |
[프로그래머스-Level 03] - 2xN타일링 (C++) (0) | 2019.12.29 |
[프로그래머스-Level 03] - 추석 트래픽(c++) (0) | 2019.12.27 |