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

相關文章
相關標籤/搜索