運行要求
運行時間限制: 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的應用考察最多的地方
※ 另外,我會在個人微信我的訂閱號上推出一些文章,歡迎關注