AtCoder Context ABC 167- D - Teleporter

运行要求
运行时间限制: 2sec
内存限制: 1024MB
原文连接微信

题目
高桥王国拥有N座城市。这些城市的编号由1到N。
在这些城市中,每一座城市拥有一道传送门。城市i的传送门的目的地是城市Ai。
高桥王喜欢正整数K。人性的高桥王想知道,从城市1出发,使用K个传送门之后,正好到达哪一座城市。
请你为高桥国王编写程序。app

输入前提条件spa

  • 2<=N<=2*10^5
  • 1<=Ai<=N
  • 1<=K<=10^18

输入
输入都以如下标准从命令行输入命令行

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的应用考察最多的地方

※ 另外,我会在个人微信我的订阅号上推出一些文章,欢迎关注
二维码.jpg

相关文章
相关标签/搜索