출처 : https://www.acmicpc.net/problem/11725
트리의 부모 찾기 성공 풀이
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 3816 | 1521 | 1156 | 42.006% |
문제
루트 없는 트리가 주어진다. 이 때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
예제 입력
7 1 6 6 3 3 5 4 1 2 4 4 7
예제 출력
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
힌트
출처
- 문제를 만든 사람: baekjoon
>> 풀이 방법
트리의 수가 최대 100,000 개 이기 때문에, 메모리 초과가 날 일이 없기 때문에 미리 배열을 선언 해 놓았다.
벡터 배열 connected_node를 사용하여 연결된 노드들을 모두 각각의 vector 에 추가해준다.
그리고 나서 1번 노드부터 시작하여 부모 노드와 자식 노드를 pair 를 통해서 queue 에 추가해준다.
가령 1번 노드에 연결된 노드가 2, 3 이라면 queue에 <1, 2> <1, 3>을 넘긴다.
1번 노드부터 시작되기 때문에, 연결된 노드만 판단하면 모든 노드의 부모 노드를 확인할 수 있다.
다음에는 pair 의 second 의 값을 이용하여, 연결된 node를 확인한다.
만약, pair의 second 에 있는 인자를 인덱스로 사용하여 node_parent를 확인했을 때 그 값이 0이 아니라 부모값이 존재하면(연결된 노드 중에서 부모인 놈은) queue 를 그냥 넘기고, 0이라면 (부모가 없는 것이기 때문에) pair의 second 인자와 연결된
이런식으로 bfs 를 진행하여 정답을 구한다.
시간 복잡도는 O(n) 이다.
>> 소스 코드
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 | #include <iostream> #include <vector> #include <queue> #define MAX_SIZE 100001 using namespace std; // 0번 인덱스는 버린다. int node_parent[MAX_SIZE] = { 0 }; vector<int> connected_node[MAX_SIZE]; int total_node; void bfs() { queue<pair<int, int>> bfs_queue; // 1번 노드를 부모로 하여 자식을 queue 에 밀어 넣는다. for (int i = 0; i < connected_node[1].size(); i++) { bfs_queue.push({ 1, connected_node[1].at(i) }); } while (bfs_queue.size()) { pair<int, int> sub_connect = bfs_queue.front(); bfs_queue.pop(); // 부모 표시 node_parent[sub_connect.second] = sub_connect.first; // first 와 관련있는 노드를 queue에 밀어 넣는다. for (int i = 0; i < connected_node[sub_connect.second].size(); i++) { if (node_parent[connected_node[sub_connect.second].at(i)] == 0) { bfs_queue.push({ sub_connect.second, connected_node[sub_connect.second].at(i) }); } } } } int main() { cin >> total_node; for (int i = 0; i < total_node - 1; i++) { int sub_node_1, sub_node_2; scanf("%d %d", &sub_node_1, &sub_node_2); // 연결된 노드에 모두 연결 connected_node[sub_node_1].push_back(sub_node_2); connected_node[sub_node_2].push_back(sub_node_1); } node_parent[1] = -1; bfs(); for (int i = 2; i <= total_node; i++) { printf("%d\n", node_parent[i]); } return 0; } | cs |