https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 문제이다.
입력으로 트리 상에서 연결된 두 정점이 주어지는데
이를 통해 노드들을 탐색하면서 연결된 노드가 방문 처리가 안 됐으면 타고 온 노드의 자식 노드이기에 완전 탐색과 깊이탐색 두가지로 풀어보았다.
먼저 완전 탐색부터 보면
1. 주어진 연결 정점 쌍을 통해 그래프를 만든다.
2. 루트 노드가 1이므로 1부터 큐에 삽입
3. 삽입된 노드와 인접한 노드를 탐색하며 방문 되지 않았다면 인접한 노드를 큐에 삽입 후 삽입된 노드를 부모 노드로 저장
4. 큐가 빌 때까지 2,3번 반복
#include <iostream>
#include <queue>
using namespace std;
vector<int> t[100001];
int visited[100001];
int parent[100001];
void bfs() {
queue<int> q;
q.push(1);
while(!q.empty()) {
int x = q.front();
visited[x] = 1;
q.pop();
for(int i=0; i<t[x].size(); i++) {
int y = t[x][i];
if(!visited[y]) {
q.push(y);
parent[y] = x;
}
}
}
}
int main(void) {
int N, a, b;
cin >> N;
for(int i=0; i<N-1; i++) {
cin >> a >> b;
t[a].push_back(b);
t[b].push_back(a);
}
bfs();
for(int i=2; i<=N; i++) {
cout << parent[i] << "\n";
}
}
다음으로 깊은 탐색이다.
큐 대신 재귀 함수를 사용한다는 점 말고는 기본 로직은 똑같다.
1. 연결 정점 쌍을 통해 그래프를 만든다.
2. 루트 노드인 1부터 탐색
3. 해당 노드의 부모 배열 값이 0이면 타고 온 노드를 부모로 저장
#include <iostream>
#include <vector>
using namespace std;
vector<int> v[100001];
int parent[100001];
void dfs(int x) {
for(int i=0; i<v[x].size(); i++) {
int y = v[x][i];
if(parent[y] == 0) {
parent[y] = x;
dfs(y);
}
}
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i=0; i<n-1; i++) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
parent[1] = 1;
dfs(1);
for(int i=2; i<=n; i++) {
cout << parent[i] << "\n";
}
}
문제와는 별개로 아래 코드가 궁금해 따로 찾아보았다.
ios::sync_with_stdio(false);
cin.tie(0);
C와 C++ 표준 stream의 동기화를 비활성화하고 cin과 cout을 묶어주는 과정을 수행하지 않는 코드라고 한다.cin과 cout만 사용한다면 이를 통해 입출력 시간을 줄여주어 시간 초과를 피할 수도 있다.
https://dingcoding.tistory.com/62
ios::sync_with_stdio(false), cin.tie(0) 쓰는 이유, 백준 시간초과 해결
1. ios::sync_with_stdio(false), cin.tie(0) 은 무엇인가? 보통 백준, 프로그래머스 같은 온라인 저지 사이트에서 C++을 이용하여 알고리즘 문제를 풀 때 시간초과를 방지하기 위해서 이 두 줄을 추가해줍니
dingcoding.tistory.com
'알고리즘 풀이' 카테고리의 다른 글
[백준][C++] 1004번: 어린 왕자 (0) | 2024.03.29 |
---|---|
[백준][C++] 10845번: 큐 (0) | 2024.03.29 |
[백준][C++] 1766번: 문제집 (0) | 2024.03.27 |
[백준][C++] 9251번: LCS (1) | 2024.03.26 |
[백준][C++] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2024.03.26 |