문제
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.
출력
총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 길이가 양수인 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.
- 문제 풀이 방법
! 핵심 알고리즘 !
: 플로이드-워셜 알고리즘을 사용한다.
https://allyouredreaminof.tistory.com/54
[Algorithm] 플로이드-워셜 알고리즘
플로이드-워셜 알고리즘 - 그래프에서 최단 거리를 구하는 알고리즘으로, 모든 노드 간에 최단 경로를 탐색한다. 특징 - 음수 가중치 에지가 있어도 수행이 가능하다. - 동적 계획법의 원리를 이
allyouredreaminof.tistory.com
모든 노드 간에 최단 경로를 탐색하는 알고리즘인데,
핵심 원리는 노드 A부터 노드 B까지의 최단 경로 위에 노드 K가 존재한다면 그것을 이루는 부분 경로 또한 최단 경로라는 것이다.
이 문제는 해당 알고리즘을 변형한 문제이다.
최단 경로를 구하는 것이 아니라 모든 노드에 대해 경로가 있는지 여부를 구하는 문제이다.
1. 배열 선언 및 초기화한다.
2. 입력 데이터를 인접 행렬에 저장한다.
3. 플로이드-워셜 알고리즘을 수행한다.
k라는 중간 노드를 거쳐 만들어지는 경로 중 1개라도 연결되어 있는 경로가 있다면 연결 노드로 취급한다.
4. 배열 출력
- 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 배열 생성 및 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int[][] D = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
int v = Integer.parseInt(st.nextToken());
D[i][j] = v;
}
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// k를 거치는 모든 경로 중 1개라도 연결되어 있는 경로가 있다면, i와 j는 연결 노드 취급
if (D[i][k] == 1 && D[k][j] == 1) {
D[i][j] = 1;
}
}
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(D[i][j] + " ");
}
System.out.println();
}
br.close();
}
}
https://www.acmicpc.net/problem/11403
11403번: 경로 찾기
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
www.acmicpc.net
'코딩 테스트 > 백준' 카테고리의 다른 글
| [백준/Java] 1940번 - 주몽 (0) | 2023.08.25 |
|---|---|
| [백준/Java] 2018번 - 수들의 합 5 (0) | 2023.08.25 |
| [백준/Java] 11660번 - 구간 합 구하기 5 (0) | 2023.08.11 |
| [백준/Java] 11659번 - 구간 합 구하기 4 (0) | 2023.08.11 |
| [백준/Java] 1546번 - 평균 (0) | 2023.08.11 |