카테고리 없음
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 |
입력값, 출력값