후손 수 세기

시간 제한1초메모리 제한128 MB

요약
가계도와 세대 거리 d가 주어질 때, 각 사람의 정확히 d세대 아래 후손 수를 세고 가장 많은 사람을 순위대로 출력한다.
난이도

보통10점 중 4점

유형
그래프, DFS, 구현
정답자
아직 제출이 없습니다

문제

어느 가계도(족보) 서비스는 고객들의 가계도를 저장한다. 최근 한 고객이 소프트웨어가 답할 수 없는 질문을 했다. "우리 가족 중 손주가 가장 많은 사람은 누구인가?" 그리고 증손주, 고손주 등에 대한 비슷한 질문들이다.

주어진 가계도와 거리 dd에 대해, 어떤 사람의 해당 후손이란 그 사람보다 정확히 dd세대 아래에 있는 사람들을 말한다. d=1d = 1이면 자녀, d=2d = 2이면 손주, d=3d = 3이면 증손주, 이런 식으로 이어진다. 해당 후손이 가장 많은 사람들을 찾아라.

입력

첫 줄에 테스트 케이스의 개수를 나타내는 정수 하나가 주어진다.

각 테스트 케이스는 두 양의 정수 nn과 dd가 있는 줄로 시작한다. nn은 뒤따르는 설명 줄의 개수이고, dd는 질문의 세대 거리이다(d=1d = 1이면 자녀, d=2d = 2이면 손주, 이런 식이다).

이어지는 nn개의 줄은 각각 다음 형태이다.

name m dname1 dname2 ... dnamem

여기서 name은 가족 구성원의 이름, m은 그 사람의 자녀 수, dname1 ... dnamem은 자녀들의 이름이다. 줄들은 특별한 순서 없이 주어진다. nn개의 줄은 전체가 하나의 연결된 트리를 이룬다. 한 트리에는 최대 1000명이 있고, 모든 이름은 길이가 최대 10자이다.

출력

각 테스트 케이스마다 먼저 다음 줄을 출력한다.

Tree i:

여기서 i는 1부터 시작하는 테스트 케이스 번호이다.

그다음, 해당 후손이 하나 이상인 사람들을 해당 후손 수가 많은 순서로 정렬하고, 수가 같으면 이름의 알파벳(사전) 순서로 정렬한다. 이 정렬에서 앞의 세 명을 출력하되, 3위의 수가 동점이어서 세 명을 넘게 되면 그 3위의 수 이상인 사람을 모두 출력한다(맨 아래에서 동점인 사람은 모두 포함한다). 해당 후손이 있는 사람이 세 명 미만이면 그 사람들만 출력하고, 아무도 없으면 한 명도 출력하지 않는다. 출력하는 각 사람은 한 줄에 이름, 공백 한 칸, 해당 후손 수 순으로 적는다.

연속한 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

예제1

  1. 예제 1

    입력
    3
    8 2
    Barney 2 Fred Ginger
    Ingrid 1 Nolan
    Cindy 1 Hal
    Jeff 2 Oliva Peter
    Don 2 Ingrid Jeff
    Fred 1 Kathy
    Andrea 4 Barney Cindy Don Eloise
    Hal 2 Lionel Mary
    6 1
    Phillip 5 Jim Phil Jane Joe Paul
    Jim 1 Jimmy
    Phil 1 Philly
    Jane 1 Janey
    Joe 1 Joey
    Paul 1 Pauly
    6 2
    Phillip 5 Jim Phil Jane Joe Paul
    Jim 1 Jimmy
    Phil 1 Philly
    Jane 1 Janey
    Joe 1 Joey
    Paul 1 Pauly
    
    예상 출력
    Tree 1:
    Andrea 5
    Don 3
    Cindy 2
    
    Tree 2:
    Phillip 5
    Jane 1
    Jim 1
    Joe 1
    Paul 1
    Phil 1
    
    Tree 3:
    Phillip 5