본문 바로가기
알고리즘/백준

2644.촌수계산 - python

by 1.5볼트 2023. 4. 21.
728x90

https://www.acmicpc.net/problem/2644

 

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어

www.acmicpc.net

 

dfs
부모가 1명만 있는 구조

 

형제끼리는 촌수가 더해지지 않고 위아래로만 더해지니까 이진 트리에서 한 부모 밑에 2마리까지의 길이의 합과 같음

최소 조상부터 위에는 모두 동일한 조상이기 때문에 그 조상들은 다 제거한다


이진트리 구조이기 때문에 그냥 한 단계씩 위로 올라가면서 마주치는 조상들을 각각 리스트에 넣어놓고
2마리의 같은 조상은 다 제거하면 남은 리스트의 길이의 합이 촌수이다

d={}
input()
s,e=map(int,input().split())
n=int(input())
for i in range(n):
    a,b=map(int,input().split())
    d[b]=a
    
def f(x,t):
    if d.get(x):
        return f(d[x],t+[x])
    return t+[x]
    
s1=set(f(s,[]))
e1=set(f(e,[]))

p=s1&e1
if p:
    s1-=p
    e1-=p
    print(len(e1)+len(s1))
else:
    print(-1)

'알고리즘 > 백준' 카테고리의 다른 글

1644.소수의 연속합 - python  (0) 2023.04.24
1806.부분합  (0) 2023.04.23
2146.다리 만들기 - python  (0) 2023.04.20
1341.사이좋은 형제 - python  (0) 2023.04.19
7569.토마토  (0) 2023.03.25

댓글