我正在努力解决这个任务:
新年时,学生们玩秘密圣诞老人。每个学生
i
给一个学生
a_i
他们必须送礼物给谁。游戏管理员给每个学生分配了自己的号码。但后来他的同事问:如果你从学生那里开始一系列礼物,这是真的吗
1
学生
a_1
,然后依此类推,然后链条将与学生闭合
1.
在所有其他学生都参与其中一次之后?管理员不知道这是不是真的,但他将只更改一个
a_i
number以获得适合其同事的配置。帮他解决这个问题。
第一行包含一个自然数
n
(2<=n<=10**5)学童人数。下一行包含
n
数字
a_i
带着号码去秘密圣诞老人那里的学生
我
(1<=
a_i
<=n
输出的第一行应包含两个数字(1<=x,y<=n;x!=y)-带数字的学生
x
谁的
a_x
应该改变和新的价值
a_x
请注意
a_x != y
。如果存在多个答案,请打印任何答案。如果无法打印
-1 -1
.
示例:
输入:
3
1 2 3
输出:
-1 -1
输入:
3
1 3 1
输出:
1 2
我写了这段代码来解决这个任务:
n = int(input())
students = [int(x) for x in input().split()]
a, b = -1, -1
for x in range(1, n + 1):
d = [x]
vals = set()
vals.add(x)
for i in range(1, n + 1):
val = students[d[i - 1] - 1]
d.append(val)
if val in vals: break
vals.add(val)
# print(f'x = {x} | d = {d}')
if len(set(d)) == n:
if d[-1] != d[0]:
a = d[-2]
b = d[0]
print(a, b)
我认为这基本上等同于发现是否存在一个距离循环一步之遥的图。
代码似乎解决了我尝试的情况。然而,它并没有通过所有的测试。有人能帮忙指出这里可能出了什么问题吗?提前感谢。