루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
풀이
유니온 파인드를 공부하고 있었던거라 유니온 파인드로 풀어보려 했는데, 이미 루트가 1로 정해져있는 트리이기 때문에 사용할 수 없었다
dfs를 사용해서 해결했는데, 리프노드까지 쭉 내려갔다가 리프노드의 부모노드를 저장하고, 위로 쭉 타고타고 올라가면서 부모노드를 저장해야하기 때문에 bfs보다는 dfs가 적절한 것 같다
dfs 를 재귀호출한 후에 더 이상 인접 노드가 없으면(해당 노드가 리프노드) dfs 호출이 종료되고 부모노드를 저장한다
코드
import sys
sys.setrecursionlimit(100000000)
n = int(sys.stdin.readline())
visited = [False for _ in range(n+1)]
graph = [[] for _ in range(n+1)]
answer = [0]*(n+1)
def dfs(graph, visited, start):
visited[start] = True
for elem in graph[start]:
if not visited[elem]:
dfs(graph, visited, elem)
answer[elem] = start
for _ in range(n-1):
u, v = map(int, sys.stdin.readline().split())
graph[u].append(v)
graph[v].append(u)
dfs(graph, visited, 1)
for elem in answer[2:]:
print(elem)