코딩테스트준비
백준 11725. 트리의 부모 찾기 (트리 bfs, dfs)
haeullee
2023. 7. 31. 16:41
https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
1. 재귀 dfs
#include <iostream>
#include <unordered_set>
#include <vector>
#include <queue>
using namespace std;
int n;
int u, w;
vector<int> adj[100002];
int p[100002];
void dfs(int cur)
{
for(auto nxt : adj[cur])
{
if(p[cur] == nxt) continue; // 부모 노드로 가는 것을 막음.
p[nxt] = cur;
dfs(nxt);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n - 1; i++)
{
cin >> u >> w;
adj[u].push_back(w);
adj[w].push_back(u);
}
dfs(1);
for(int i =2; i <= n; i++) cout << p[i] << '\n';
}
2. 비재귀 dfs
#include <iostream>
#include <unordered_set>
#include <vector>
#include <stack>
using namespace std;
int n;
int u, w;
vector<int> adj[100002];
int p[100002];
void dfs(int sv)
{
stack<int> _stack;
_stack.push(sv);
while(!_stack.empty())
{
int cur = _stack.top();
_stack.pop();
for(auto m: adj[cur])
{
if(p[cur] == m) continue;
p[m] = cur;
_stack.push(m);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n - 1; i++)
{
cin >> u >> w;
adj[u].push_back(w);
adj[w].push_back(u);
}
dfs(1);
for(int i =2; i <= n; i++) cout << p[i] << '\n';
}
3. bfs
#include <iostream>
#include <unordered_set>
#include <vector>
#include <queue>
using namespace std;
int n;
int u, w;
vector<int> adj[100002];
int p[100002];
void bfs(int sv)
{
queue<int> _queue;
_queue.push(sv);
while(!_queue.empty())
{
int cur = _queue.front();
_queue.pop();
for(auto m: adj[cur])
{
if(p[cur] == m) continue;
p[m] = cur;
_queue.push(m);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n - 1; i++)
{
cin >> u >> w;
adj[u].push_back(w);
adj[w].push_back(u);
}
bfs(1);
for(int i =2; i <= n; i++) cout << p[i] << '\n';
}