문제
24482번: 알고리즘 수업 - 깊이 우선 탐색 4
깊이 우선 탐색 트리는 1, 2, 3, 4번 노드로 구성된다. 1번 노드가 루트이다. 1번 노드의 자식은 4번 노드이다. 4번 노드의 자식은 3번 노드이다. 3번 노드의 자식은 2번 노드이다. 5번 노드는 1번 노드
www.acmicpc.net
알고리즘
그래프, 깊이우선탐색(DFS)
풀이
초기화
1. 양방향 인접리스트로 그래프를 저장
2. 모든 정점의 깊이를 -1로 초기화
3. 정점 번호를 내림차순으로 방문한다는 조건이 있으므로 인접 리스트를 내림차순으로 정렬한다.
DFS
R을 시작으로
현재 정점의 깊이를 저장하고 깊이를 1씩 늘리며
방문하지 않은(depth[next] != -1) 다음 정점에 대해 재귀 호출한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int[] depth;
static List<Integer>[] graph;
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 M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
depth = new int[N + 1];
Arrays.fill(depth, -1);
graph = new ArrayList[N + 1];
for (int i = 1; i <= N; i++)
graph[i] = new ArrayList<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph[u].add(v);
graph[v].add(u);
}
for (int i = 1; i <= N; i++)
Collections.sort(graph[i], Collections.reverseOrder());
dfs(R, 0);
StringBuilder sb = new StringBuilder();
for(int i=1; i<=N; i++)
sb.append(depth[i]).append(" ");
System.out.println(sb);
}
private static void dfs(int cur, int d) {
depth[cur] = d;
for(int next: graph[cur]) {
if(depth[next] != -1) continue;
dfs(next, d + 1);
}
}
}
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준] 9370. 미확인 도착지 (Java) (0) | 2022.12.19 |
---|---|
[백준] 17197. Fence Planning (Java) (0) | 2022.12.19 |
[백준] 21736. 헌내기는 친구가 필요해 (Java) (0) | 2022.12.19 |
[백준] 16936. 나3곱2 (Java) (0) | 2022.12.15 |
[백준] 16943. 숫자 재배치 (Java) (0) | 2022.12.15 |