카테고리 없음

1248. [S/W 문제해결 응용] 3일차 - 공통조상

아메숑 2019. 3. 4. 20:39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//a로 부터 root까지의 거리
def distR(a):
    n = 1
    while parent[a] != 1:
        a = parent[a]
        n += 1
    return n
 
//a와 b의 공통조상 발견
def findP(a,b,a_d,b_d):
    if a_d > b_d:
        while a_d != b_d:
            a = parent[a]
            a_d -= 1
    else:
        while a_d != b_d:
            b = parent[b]
            b_d -= 1
    if a_d == b_d:
        while parent[a] != parent[b]:
            a = parent[a]
            b = parent[b]
    return parent[a]
 
//공통조상의 모든 자손의 수 
def findC(parent):
    m = 1
    for i in range(len(child[parent])):
        m += findC(child[parent][i])
    return m
 
for t in range(int(input())):
    v,e,a,b = map(int,input().split())
    lis = list(map(int,input().split()))
    child = [[]for _ in range(v+2)]
    parent = [0]*(v+2)
    for i in range(0,e*2,2):
        parent[lis[i+1]] = lis[i]
        child[lis[i]].append(lis[i+1])
    a_d = distR(a)
    b_d = distR(b)
    prt = findP(a,b,a_d,b_d)
    cld = findC(prt)
    print(f'#{t+1} {prt} {cld}')
 
cs

입력값, 출력값