Leetcode # 2876. Count Visited Nodes in a Directed Graph
Problem
https://leetcode.com/contest/weekly-contest-365/problems/count-visited-nodes-in-a-directed-graph/
Testcases
| # | Input | Expected |
|
1
|
[7,0,7,0,5,3,3,0] |
[2,3,3,3,5,4,4,2] |
|
|
[3,6,1,0,5,7,4,3] |
[2,7,8,2,5,4,6,3] |
|
|
[8,17,14,8,14,12,16,11,4,14,19,6,8,8,2,10,2,1,1,18] |
[5,2,2,5,3,6,4,6,4,3,5,5,5,5,2,6,3,2,3,4] |
|
|
[6,3,6,1,0,8,0,6,6] |
[2,2,3,2,3,4,2,3,3] |
First Solution
Time Complexity: O()
Space Complexity: O()
(The input and output generally do not count towards the space complexity.)
class Solution:
def countVisitedNodes(self, edges: List[int]) -> List[int]:
n = len(edges)
result = [0] * n
internals = set(edges)
externals = set(i for i in range(n)) - internals
def cal_len(node):
nonlocal result, externals, internals
passed_n, visited, curr = 0, {}, node
while curr not in visited:
visited[curr] = passed_n
passed_n += 1
curr = edges[curr]
result[node] = passed_n
cycle_start_i, cycle_start_node = visited[curr], curr
result[cycle_start_node] = passed_n - cycle_start_i
curr = edges[node]
for j in range(1, passed_n):
if curr in externals:
externals.remove(curr)
if curr in internals:
internals.remove(curr)
if curr != cycle_start_node:
if result[curr] != 0: break
result[curr] = result[cycle_start_node] + ((cycle_start_i - j) if j < cycle_start_i else 0)
curr = edges[curr]
while externals:
cal_len(externals.pop())
while internals:
cal_len(internals.pop())
return result
Last Updated on 2023/10/01 by A1go