728x90
SMALL
백준 문제 풀이: 11725 [트리의 부모 찾기]
문제 링크: https://www.acmicpc.net/problem/11725
문제 설명:
루트가 1인 트리가 주어질 때, 각 노드의 부모를 구하는 문제입니다. 트리는 무방향 그래프로 주어지며, n개의 노드와 n-1개의 간선을 가집니다.
입력:
- 첫째 줄에 노드의 개수
n
(2 ≤n
≤ 100,000)이 주어집니다. - 다음
n-1
개의 줄에 간선 정보가 주어집니다. 각 줄에는 두 정수x
,y
가 주어지며, 이는 노드x
와 노드y
가 연결되어 있음을 나타냅니다.
출력:
- 2번 노드부터 n번 노드까지의 부모를 한 줄에 하나씩 출력합니다.
문제 해결 코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector tree[100001];
int parent[100001];
bool visited[100001];
void findParents(int root) {
queue q;
q.push(root);
visited[root] = true;
while (!q.empty()) {
int current = q.front();
q.pop();
for (int child : tree[current]) {
if (!visited[child]) {
visited[child] = true;
parent[child] = current;
q.push(child);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
tree[a].push_back(b);
tree[b].push_back(a);
}
findParents(1);
for (int i = 2; i <= n; i++) {
cout << parent[i] << '\n';
}
return 0;
}
예제
입력:
7
1 6
6 3
3 5
4 1
2 4
4 7
출력:
4
6
1
3
1
4
코드 설명
- 그래프 생성:
- 트리를 인접 리스트로 표현합니다.
- 루트에서 BFS 실행:
- 1번 노드를 루트로 설정하고 BFS를 수행하여 각 노드의 부모를 구합니다.
- 방문한 노드는
visited
배열로 체크합니다.
- 부모 노드 출력:
- 2번 노드부터 n번 노드까지 부모를 출력합니다.
시간 복잡도
- 트리는 n개의 노드와 n-1개의 간선을 가지므로 BFS의 시간 복잡도는 O(n)입니다.
결과
코드는 입력된 트리 구조를 정확히 탐색하며, 각 노드의 부모를 효율적으로 계산합니다. BFS를 사용해 O(n)의 시간 복잡도로 문제를 해결하며, 대규모 입력에도 적합합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 12851번 [숨바꼭질 2](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
---|---|
백준 11779번 [최소비용 구하기 2](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
백준 11404번 [플로이드](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
백준 5639번 [이진 검색 트리](C++)-yes6686- 티스토리 (0) | 2024.12.26 |
백준 2638번 [치즈](C++)-yes6686- 티스토리 (0) | 2024.12.26 |