더 많이 실패하기

공부 205일차: 백준 11725번 트리의 부모 찾기 자바 java 본문

알고리즘/백준

공부 205일차: 백준 11725번 트리의 부모 찾기 자바 java

김발자~ 2023. 2. 20. 22:06
반응형

11725 트리의 부모 찾기

https://www.acmicpc.net/problem/11725

 

11725번: 트리의 부모 찾기

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

 


백준 11725번 문제 트리의 부모 찾기


문제


 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 256 MB 54770 23999 17095 42.114%

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

예제 입력 1

7
1 6
6 3
3 5
4 1
2 4
4 7

예제 출력 1

4
6
1
3
1
4

예제 입력 2

12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12

예제 출력 2

1
1
2
3
3
4
4
5
5
6
6

 

 

 


과정 생각해보기 & 오답


 

https://gimbalja.tistory.com/360

 

공부 200일차: 백준 13913번 숨바꼭질 4 자바 java

13913 숨바꼭질 4 https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는

gimbalja.tistory.com

이 문제와 매우 유사

bfs를 돌리면서 부모를 저장하면 된다

물론 dfs로도 가능하다

 

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.io.*;
import java.util.*;
 
public class Main {
 
    static int n;
    static ArrayList<ArrayList<Integer>> tree = new ArrayList<>();
    static boolean[] visited;
    static int[] parent;
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        n = Integer.parseInt(br.readLine());
        visited = new boolean[n];
        parent = new int[n];
        
        for(int i = 0; i < n; i++) {
            tree.add(new ArrayList<Integer>());
        }
        
        for(int i = 0; i < n-1; i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken())-1;    // n개만 만들기 위해 -1
            int y = Integer.parseInt(st.nextToken())-1;
            tree.get(x).add(y);
            tree.get(y).add(x);
        }
        bfs();
        for(int i = 1; i < n; i++) {    // 2부터 부모 구함
            bw.write(parent[i]+"\n");
        }
        bw.flush();
        bw.close();
        br.close();
 
    }
    
    // 부모 찾기
    static void bfs() {
        Queue<Integer> q = new LinkedList<>();
        q.add(0);    // 1부터 시작(하지만 인덱스 떄문에 0부터)
        visited[0= true;
        
        while(!q.isEmpty()) {
            int now = q.poll();
            
            for(int i : tree.get(now)) {    // 현재 노드와 연결된 모든 수
                if(!visited[i]) {
                    visited[i] = true;
                    q.add(i);
                    parent[i] = now+1;    // 부모 저장할 땐 앞서 빼준 +1
                }
            }
        }
    }
 
}
 
cs

 

 

 


 

그냥 매우 간단한 bfs 문제다

반응형
Comments