运行要求
运行时间限制: 2sec
内存限制: 1024MB
原文连接微信
题目
高桥王国拥有N座城市。这些城市的编号由1到N。
在这些城市中,每一座城市拥有一道传送门。城市i的传送门的目的地是城市Ai。
高桥王喜欢正整数K。人性的高桥王想知道,从城市1出发,使用K个传送门之后,正好到达哪一座城市。
请你为高桥国王编写程序。app
输入前提条件spa
输入
输入都以如下标准从命令行输入命令行
N K A1 A2 A3 A4...An
输出
输出从城市1出发,使用K次传送门后正好到达的城市code
例1
输入队列
4 5 3 2 4 1
输出内存
4
从城市1出发,使用5次传送门的话,以1->3->4->1->3->4的顺序移动get
例2
输入input
6 727202214173249351 6 5 2 5 3 2
输出it
2
读懂题目
传送门能够看做一个节点,一个传送门能够传送到另一个城市,并且仅仅能传送到一个城市。咱们能够把节点和节点之间的关系当作是单向的。
如例1,咱们能够把输入抽象成下面的节点图。
解题思路
咱们能够看到,这个节点图有那么几个特色
1个节点只能通向另一个节点。好比A->B表明A通向B,那么只会存在A->B,不会存在A->C
节点和节点之间的指向是单一方向的,好比A->B表明节点A通向B,除非B专门指向A才会有B->A
中间可能会造成环形
由于节点只通向另一个节点而不是另外多个节点,因此环状只能有一个
K的值特别大,最大可能达到10^18,因此必定是经过计算获得的。
K的值可能很小,尚未到环上,这种状况下直接求出
K的值可能比较大,到达了环上,那么这种状况咱们能够经过K的值和换的周长,取余来计算最终到达环的哪一个地方
能够用dfs来遍历,遍历到环的末尾的时候,中止遍历。
能够把遍历图中获得的值放在一个队列里面。
代码
import sys sys.setrecursionlimit(100000000) N,K = map(int,input().split()) ARR = list(map(int,input().split())) NodeStatus = [False] * N NodeFirstSteps = [0] * N L = 0 STARTLINDEX = 0 OrderARR = [] def dfs(pos, arr, step): if NodeStatus[pos] == True: L = (step - NodeFirstSteps[pos]) STARTLINDEX = NodeFirstSteps[pos] print(OrderARR[(K - STARTLINDEX) % L + STARTLINDEX] + 1) return if step == K: print(pos+1) return OrderARR.append(pos) NodeStatus[pos] = True NodeFirstSteps[pos] = step dfs(arr[pos] - 1, arr, step + 1) dfs(0, ARR, 0)
总结
这道题考察了对dfs的应用。在dfs的遍历过程当中如何求出环的周长是对dfs的应用考察最多的地方
※ 另外,我会在个人微信我的订阅号上推出一些文章,欢迎关注