考え方
以下がすごくわかりやすい.ゲームの後退解析(負けにしか遷移できない状態から考える)みたいな考え方.Editorial - AtCoder Beginner Contest 245
トポロジカルソートっぽく実装できる(トポロジカルソート - 競プロはじめました).
回答例
from collections import deque N, M = map(int, input().split()) IG = [[] for _ in range(N)] outdeg = [0] * N for _ in range(M): u, v = map(lambda x:int(x) - 1, input().split()) IG[v].append(u) outdeg[u] += 1 ans = set(i for i in range(N)) q = deque() for v in range(N): if outdeg[v] == 0: q.append(v) while q: v = q.pop() ans.remove(v) for chi in IG[v]: outdeg[chi] -= 1 if outdeg[chi] == 0: q.append(chi) print(len(ans))