白駿2617ビーズ/python dfsを検索




コア:
  • 奇数のN個のビーズを与えた.
  • 自分より重い球数(N/2)+1個または
  • 自分より軽い球数(N/2)+1個
  • import sys
    
    sys.setrecursionlimit(10 ** 8)
    
    n, m = map(int, sys.stdin.readline().split())
    graph = [[] for _ in range(n + 1)]
    rev_graph = [[] for _ in range(n + 1)]
    for _ in range(m):
        i, j = map(int, sys.stdin.readline().split())
        graph[i].append(j)
        rev_graph[j].append(i)
    
    
    def dfs(specific_graph, now):
        visit[now] = True
        for next in specific_graph[now]:
            if not visit[next]:
                dfs(specific_graph, next)
    
    
    count = 0
    for i in range(1, n + 1):
        visit = [False] * (n + 1)
        dfs(graph, i)
        if sum(visit) - 1 >= n // 2 + 1:
            count = count + 1
        else:
            visit = [False] * (n + 1)
            dfs(rev_graph, i)
            if sum(visit) - 1 >= n // 2 + 1:
                count = count + 1
    print(count)
    コース:
    入力
  • :重球個数を求める図と軽球個数を求めるrev図を同時に入力します.
  • dfs:
  • アクセス検証アレイを作成し、
  • を初期化
  • dfsを迂回して出てきたとき、visitでは、実際の値を持つインデックスは私より重いビーズだったという意味です.
  • したがって、sum(visit)-1(私以外の球数)がn/2+1(奇数個、中央値を超える)個より大きい場合、count+=1
  • (重量の個数が1/2+1未満の場合)は、軽球についてもrev graphを用いてdfsを行い、countに中心値として反映できるかどうかを決定する.