-문제: https://www.acmicpc.net/problem/3584
3584번: 가장 가까운 공통 조상
루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두
www.acmicpc.net
처음에는 한 값을 기준으로 dfs를 돌린 후 다음 값을 dfs 돌릴때 방문했던 노드를 방문하면 그것이 최소 공통조상이라고 생각하고 코드를 짰는데 계속 IndexError가 발생했다
그래서 그럼 각각의 부모노드들을 리스트로 만들어서 그것을 하나하나 비교하다가 처음으로 같은 것을 출력하면될 것이라고 생각했는데
이걸 dfs함수로 구현하면 각각 다른 리스트를 반환할텐데 그걸 어떻게 해야하나 싶은 생각이 들었다. global result같은 것을 못 쓸 것 같아서 찾아보니 그냥 while문으로 돌리고, 값을 하나씩 옮기는 식으로 진행하면된다
그리고 최소 공통 부모는 각 리스트의 끝(루트노드)부터 내려와서 같지 않은 노드가 나올때까지 반복한 후, 처음으로 같지 않은 노드가 나왔을 때 노드의 부모가 최소공통조상이라고 할 수 있다
-정답풀이:
t=int(input())
for _ in range(t):
n=int(input())
graph=[0]*(n+1)
for _ in range(n-1):
a,b=map(int,input().split())
graph[b]=a
x,y=map(int,input().split())
x_list=[x]
y_list=[y]
while graph[x]:
x_list.append(graph[x])
x=graph[x] #자식노드에서 부모노드로 이동
while graph[y]:
y_list.append(graph[y])
y=graph[y]
x_level=len(x_list)-1 #이 인덱스는 모두 루트 노드
y_level=len(y_list)-1
while x_list[x_level]==y_list[y_level]:
x_level-=1
y_level-=1
print(x_list[x_level+1])
-틀린풀이:
def dfs(v):
visit[v]=1
for i in graph[v]:
if visit[i]:
print(i)
exit()
if not visit[i]:
dfs(i)
t=int(input())
for _ in range(t):
n=int(input())
visit=[0]*(n+1)
graph=[[]*(n+1)]
for _ in range(n-1):
a,b=map(int,input().split())
graph[b].append(a)
x,y=map(int,input().split())
dfs(x)
dfs(y)
'백준 > Search' 카테고리의 다른 글
[백준/dfs] 15681번: 트리-쿼리 (0) | 2022.03.11 |
---|---|
[백준/bfs] 1303번: 전쟁-전투 (0) | 2022.03.11 |
[백준/dfs] 1103번: 게임 (0) | 2022.03.10 |
[백준/bfs] 16946번: 벽 부수고 이동하기4(TypeError해결,함수 공부) (0) | 2022.03.10 |
[백준/dfs] 1941번: 소문난 칠공주 (0) | 2022.03.08 |