classSolution: defmaximumInvitations(self, favorite: List[int]) -> int: n = len(favorite) deg = [0] * n rg = [[] for _ inrange(n)] for x, y inenumerate(favorite): rg[y].append(x) deg[y] += 1
q = deque(i for i, d inenumerate(deg) if d == 0) while q: x = q.popleft() y = favorite[x] deg[y] -= 1 if deg[y] == 0: q.append(y)
defrdfs(x: int) -> int: m_depth = 1 for y in rg[x]: if deg[y] == 0: m_depth = max(m_depth, rdfs(y) + 1) return m_depth
max_ring_size = sum_chine_size = 0 # 找基环的套路 for i, d inenumerate(deg): if d <= 0: continue res = 0 x = i whileTrue: res += 1 deg[x] = -1 x = favorite[x] if x == i: break if res == 2: sum_chine_size += rdfs(i) + rdfs(favorite[i]) else: max_ring_size = max(max_ring_size, res)