※簡單方法(效能稍差):
※其它方法(效能較佳):(時間複雜度較小)
想法:Step1.將樹葉節點納入待拜訪的佇列 (queue)
Step2.逐一由佇列中取出節點並拜訪各自的父節點並更新該父節點高度值
Step3.一旦被處理的父節點之子節點皆被拜訪過後,將該父節點也塞入待拜訪佇列的尾端
Step4.重複 Step2~3 直到拜訪到根節點為止
import queue
In = input().strip()
while In!="":# while not In
n= int(In)
p=[-1]*(n+1) #p[i]=j,表示i的雙親為j
d=[0]*(n+1) #紀錄節點深度
num=[0]*(n+1) #紀錄節點的子節點個數,子節點計算過後就減1
t =queue.Queue() #儲存待走訪之節點
for i in range(1,n+1): #為方便觀察從索引 1 開始放置元素
#line = list(map(int,f.readline().split()) )
line = list(map(int,input().split()) ) #讀入一行後轉換為 int
k = line[0]
num[i] = k #節點 i 的子節點個數
if k == 0:
t.put(i) #葉節點先納入待走訪的節點
else:
for j in line[1:]:
p[j] = i #使用陣列p紀錄 j 的parent為i
i = 0
node = 0
while True:
node = t.get() #取出待走訪之節點
if p[node] == -1:break #沒有父節點代表它是根節點==>結束迴圈
d[p[node]]=max(d[p[node]],d[node]+1) #葉節點深度+1 和 已記錄之深度取大者作為本節點深度
num[p[node]]=num[p[node]]-1 #父節點底下未走謗過的子節點數目減1
if num[p[node]] == 0: #當所有子節點都走訪過時,將該父節點納入待走訪之節點
t.put(p[node])
print(node)#最後一個從t取出的就是根節點
print(sum(d))#最後一個從t取出的就是根節點
try:In = input().strip()
except EOFError:break