ABC292E - Transitivity

考え方

回答例

各頂点に対し,「(到達できる頂点の数) - (直接到達できる頂点の数)」を計算する.

到達できる頂点は,DFSで求められる.DFSはスタックを使えば良い.
※BFSでもよい.BFSはキューで実装できる.

N, M = map(int, input().split())
G = [[] for _ in range(N)]
for _ in range(M):
    u, v = map(lambda x :int(x) - 1, input().split())
    G[u].append(v)

ans = 0
for a in range(N):
    stack = [a]
    seen = [False] * N
    seen[a] = True
    cnt_all = 0
    cnt_direct = 0
    while stack:
        cur = stack.pop()
        for chi in G[cur]:
            if seen[chi]:continue
            stack.append(chi)
            seen[chi] = True
            cnt_all += 1
            if cur == a:
                cnt_direct += 1
    ans += cnt_all
    ans -= cnt_direct

print(ans)