这道题在L2题目中属于比较简单的题了,根据题意,让我们从第二行输入中找到辈分最小的那些人并且排序输出
首先,根据第二行输入我们找到对应关系:
例如,样例中: [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)