문제링크: www.acmicpc.net/problem/15681
15681번: 트리와 쿼리
트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) 이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)
www.acmicpc.net
너무 많이 풀어본 유형이라 쉬웠다. 문제 설명이 아주 구체적이어서 그래프와 트리의 개념을 이해하기에 좋고, 그것을 실습 해보는 목적으로 풀기에 좋은 문제인 것 같다.
import java.io.*;
import java.util.*;
public class Main {
public static int N,R,Q;
public static ArrayList<Integer> []adj;
public static int ans[];
public static boolean []visited;
public static int dfs(int cnode){
int ret = 1;
for(int i=0;i<adj[cnode].size();i++){
int nnode = adj[cnode].get(i);
if(visited[nnode]) continue;
visited[nnode] = true;
ret+= dfs(nnode);
}
return ans[cnode] = ret;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
Q = Integer.parseInt(st.nextToken());
adj = new ArrayList[N+1];
ans = new int[N+1];
visited = new boolean[N+1];
for(int i=1;i<=N;i++){
adj[i] = new ArrayList<Integer>();
}
for(int i=1;i<=N-1;i++){
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
adj[s].add(e);
adj[e].add(s);
}
visited[R] = true;
dfs(R);
for(int i=0;i<Q;i++){
int query = Integer.parseInt(br.readLine());
System.out.println(ans[query]);
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 19238 스타트택시[JAVA] (0) | 2021.01.07 |
---|---|
[백준] 9370 미확인도착지[JAVA] (1) | 2021.01.07 |
[백준] 7579 앱 (0) | 2020.12.29 |
[백준] 11066 파일 합치기 (0) | 2020.12.29 |
[백준] 1956 운동 (0) | 2020.12.23 |