목차
문제 정보
https://www.acmicpc.net/problem/12524
12524번: Twibet (Large)
The first line of the input gives the number of test cases, T. T test cases follow. Each one starts with a line containing a single integer N. The next line contains N space-separated integers F1, F2, ..., FN. Monk 1 follows monk F1. Monk 2 fol
www.acmicpc.net
난이도 : S2
유형 : DFS, BFS
문제 풀이
수도승과 추종자들을 단방향 간선으로 연결시켜 준다.
그리고 수도승마다 DFS 탐색을 통해 자신을 포함하여 연결된 추종자들을 수를 세어주면 된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* BOJ - 12524
* author - devteo77
*/
public class Main {
int T;
int N;
ArrayList<Integer>[] edges;
boolean[] isVisited;
public int execDFS(int node) {
int res = 1;
for (int next : edges[node]) {
if (!isVisited[next]) {
isVisited[next] = true;
res += execDFS(next);
}
}
return res;
}
public void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
T = Integer.parseInt(br.readLine());
int tc = 1;
while (T-- > 0) {
N = Integer.parseInt(br.readLine());
edges = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
edges[i] = new ArrayList<>();
}
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
edges[Integer.parseInt(st.nextToken())].add(i);
}
sb.append("Case #").append(tc++).append(":\n");
for (int i = 1; i <= N; i++) {
isVisited = new boolean[N + 1];
isVisited[i] = true;
sb.append(execDFS(i)).append('\n');
}
}
System.out.print(sb);
}
public static void main(String[] args) throws IOException {
new Main().solution();
}
}
'Algorithm, Problem Solving > 백준(boj)' 카테고리의 다른 글
[백준][Java] 17128 - 소가 정보섬에 올라온 이유 (1) | 2023.10.11 |
---|---|
[백준][Java] 15240 - Paint bucket (0) | 2023.10.10 |
[백준][Java] 5081 - Constellations (0) | 2023.04.28 |
[백준][Java] 14397 - 해변 (0) | 2023.04.22 |
[백준][Java] 7562 - 나이트의 이동 (0) | 2023.04.03 |
댓글