-
[백준 11725] 트리의 부모 찾기알고리즘/백준 2019. 5. 11. 23:01
DFS 혹은 BFS 탐색을 사용하여 풀 수 있는 전형적인 문제이다.
가중치가 없는 양방향으로 백트래킹이 필요한 트리이기 때문에
vector<int> tree를 사용하여
tree[2].push_back(7)
tree[7].push_back(2)...을 사용했다.
stack<int> st; // 지나쳐온 노드를 저장하는 stackvector<int> tree[100001]; // tree[i] = j (i번째 노드와 j번째 노드는 연결되어있다)int depth[100001]; // 깊이를 나타낸다 (방문 여부도 검사 가능)int parent[100001]; // 인덱스별 부모를 저장하기 위한 배열루트 없는 트리가 주어진다. 이때, 트리의 루트를 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
소스코드
12345678910111213141516171819202122232425262728293031323334353637383940414243#include<iostream>#include<vector>#include<stack>using namespace std;stack<int> st; // 지나쳐온 노드를 저장하는 stackvector<int> tree[100001]; // tree[i] = j (i번째 노드와 j번째 노드는 연결되어있다)int depth[100001]; // 깊이를 나타낸다 (방문 여부도 검사 가능)int parent[100001]; // 인덱스별 부모를 저장하기 위한 배열int n;// DFS 탐색void dfs(int node) {st.push(node); // root 트리depth[node] = 0; // root 트리의 깊이는 1parent[node] = -1; // root 트리의 부모노드는 예외처리while (!st.empty()) { // 더 이상 방문할 곳이 없을 때까지int next = st.top(); // 다음 nodest.pop(); // 방문for (int i = 0; i < tree[next].size(); i++) { // next와 연결되어 있는 nodeint next2 = tree[next][i]; // next2는 next와 연결되어 있음if (depth[next2] == 0) { // 방문을 하지 않았다면 (깊이가 0)st.push(next2); // stack에 pushdepth[next2] = depth[next] + 1; // 깊이 증가parent[next2] = next; // 부모 노드 삽입}}}}int main() {int x, y;cin >> n;for (int i = 0; i < n-1; i++) {cin >> x >> y;tree[x].push_back(y); // 백트래킹을 해야하기 때문에 양방향으로 저장tree[y].push_back(x);}dfs(1);for (int i = 2; i < n+1; i++) // 2번 노드부터 부모노드 출력cout << parent[i] << '\n';return 0;}※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.
반응형'알고리즘 > 백준' 카테고리의 다른 글
[백준 3015] 오아시스 재결합 (0) 2019.05.12 [백준 9935] 문자열 폭발 (0) 2019.05.12 [백준 3111] 검열 (0) 2019.05.11 [백준 1182] 부분수열의 합 (0) 2019.05.11