[プログラマー]ランキング、[伯俊]10159号:秤


https://programmers.co.kr/learn/courses/30/lessons/49191?language=python3
https://www.acmicpc.net/problem/10159
問題の説明
二つの問題は同じ問題だ.
プログラマの問題は、2つのノードの接続(一方向)です.
ノード順序のノード数の問題が分かる.
ex) [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]
上記の一方向図が与えられると
2番ノードの前に4,3,1ノードがあり,後に5番ノードがあるため,全5ノードの中で4位となった.
また、5番目のノードは4番目の2番目のノードよりも後ろにあるので、5番目です.
上記の2つのノードを除いて,既知の等数のノードはない.
解法
問題を見て、グラフィック/DFSで解けばいいと思います.
visit配列を2 D配列に設定する(n個の開始ノードにn個の到達ノードがある)
Dfsアクセス[n][m]==True面nからmに到達可能であり、False面に到達できない
n個のノードがアクセス[n]=Trueまたはアクセス[][n]=Trueである場合、n個のノードの数はnである.
自己から到達可能なノードの数+他者から自己到達可能なノードの数=nであるため、そのノードはその順序を知ることができる.
コード#コード#
from collections import defaultdict
def solution(n, results):
    graph=defaultdict(list)
    answer=defaultdict(lambda:1)
    count=0
    visit=[[False for i in range(n+1)] for i in range(n+1)]

    def DFS(start,cur):
        visit[start][start]=True
        for i in graph[cur]:
            if not visit[start][i]:
                answer[i]+=1
                answer[start]+=1
                visit[start][i]=True
                DFS(start,i)
                
    for i,j in results:
        graph[i].append(j)
    for i in range(1,n+1): 
        DFS(i,i)
    for _,i in answer.items():
        if n==i: count+=1
    return count