BOJ 10451シーケンス周期


https://www.acmicpc.net/problem/10451
1秒、256 MBメモリ
input :
  • T
  • N (2 ≤ N ≤ 1,000)
  • 整数
  • output :
  • シーケンスに存在するシーケンス周期数
  • 隣接するノードはそれぞれ1つしかありません.
    各ノードの隣接ノードを整理する.
    ```python
    graph = [0]
    data = list(map(int, sys.stdin.readline().split()))
    for item in data:
    graph.append(item)
    ```
    図[0]には、隣接ノードが1から始まり、1から始まるように0が追加されている.
    どうやって彼らを組み合わせますか?
    ルートノード方式を使用します.
    root[now]=root[next node]の場合、ループです.
        root = [i for i in range(n + 1)]
        def DFS(start):
            global cnt
            visit[start] = True
    
            next_node = graph[start]
            if root[start] == root[next_node]:
                cnt += 1
            else:
                root[next_node] = root[start]
                DFS(next_node)
    rooteで初めて自分で初期化
    隣接ノードを解決するのは自分の場合です.
    DFSの挙動は.
    visit[start]から処理を開始し、
    ルートがnext nodeと異なる場合
    root[next node]をroot[start]値に入れます.
    DFS(next node)を実行します.
    import sys
    sys.setrecursionlimit(10000)
    
    t = int(sys.stdin.readline())
    for i in range(t):
        n = int(sys.stdin.readline())
    
        graph = [0]
        data = list(map(int, sys.stdin.readline().split()))
        for item in data:
            graph.append(item)
    
        root = [i for i in range(n + 1)]
        visit = [False] * (n + 1)
        cnt = 0
    
        def DFS(start):
            global cnt
            visit[start] = True
    
            next_node = graph[start]
            if root[start] == root[next_node]:
                cnt += 1
            else:
                root[next_node] = root[start]
                DFS(next_node)
    
        for i in range(1, n + 1):
            if not visit[i]:
                DFS(i)
        print(cnt)
    
    DFSには常にsetrecursionlimitが必要です.