[백준/Python] 11725 - 트리의 부모 찾기

고운·2024년 3월 7일

알고리즘

목록 보기
53/94

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 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)
profile
무럭무럭 성장하는 개린이 공부 공간

0개의 댓글