首先,根据第二行输入我们找到对应关系:
例如,样例中: [2,6,5,5,-1,5,6,4,7] 对应 [1,2,3,4,5,6,7,8,9],也就是键-值对应关系
[2,6,5,5,-1,5,6,4,7]中5的位置对应着[1,2,3,4,5,6,7,8,9]中的3、4、6这三个位置,以此类推
键对应父母,而值对应后代
转换成字典格式就是{ 2:1 , 6:[2,7] , 5:[3,4,6] , -1:5 , 4:8 , 7:9}
然后,按照这样的对应关系,由于辈分最高为-1,所以我们从键-1对应的值来开始查找,键为-1对应值为5,那么下一次就查找键为5的对应的值,键为5对应的值有3、4、6,下一次我们再根据[3,4,6]这三个键来查找对应的值,以此类推,直到在字典中找不到指定的键了,才停止这条查找链路
例如(-1)->(5)->(6)->(2)->(1)就是一条最长查找链路
然后最长的查找链路最后一个值即对应着最小辈分,这个链路可能不止一个,样例中就是两条
这个过程我们记录一下循环几次,然后再记录下辈分最低的成员编号,搞定!
import sys #导入模块,用于输入过程
in_1 = int(sys.stdin.readline()) #标准输入读入一行
list_1 = [x for x in range(1,in_1+1)] #列表生成式
list_2 = list(map(int,sys.stdin.readline().split())) #标准输入读入一行
dict_1 = {}
for x in range(0,len(list_2)): #生成对应字典
if list_2[x] in dict_1:
dict_1[list_2[x]].append(list_1[x])
else :
dict_1[list_2[x]] = [list_1[x]]
branch = [-1]
branch_0 = []
out_sum = 0
while True: #查找过程
for x in branch:
if x in dict_1:
branch_0 = dict_1[x] + branch_0
if branch_0 == []:
break
out_sum = out_sum + 1
branch = branch_0[:]
branch_0 = []
branch.sort()
print(out_sum)
print(*branch)