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

目錄
Bitnami