Reachable Nodes In Subdivided Graph

less than 1 minute read

882. Reachable Nodes In Subdivided Graph

DFS (Time Limit Exceeded)

class Solution:
    def reachableNodes(self, edges: List[List[int]], M: int, N: int) -> int:
        g = collections.defaultdict(list)
        reachables = collections.defaultdict(int)
        for i, j, n in edges:
            g[i].append([j, n])
            g[j].append([i, n])
        
        memo = collections.defaultdict(int)
        
        def dfs(node, steps):
            if memo[node] >= steps:
                return
            memo[node] = steps
            for neigh, dist in g[node]:
                if steps <= dist:
                    reachables[(node, neigh)] = steps
                else:
                    reachables[(node, neigh)] = dist
                    dfs(neigh, steps-dist-1)
                    
        dfs(0, M)
        ret = len(memo)
        for i, j, n in edges:
            ret += min(n, reachables[(i, j)] + reachables[(j, i)])
        return ret

Dijkstra

class Solution:
    def reachableNodes(self, edges: List[List[int]], M: int, N: int) -> int:
        g = collections.defaultdict(list)
        counts = collections.defaultdict(int)
        for i, j, n in edges:
            g[i].append([j, n])
            g[j].append([i, n])
        
        h = []
        h.append([0, 0])
        visited_edges = set()
        visited_nodes = set()
        
        while h:
            cur_steps, cur_node = heapq.heappop(h)
            visited_edges.add(cur_node)
            visited_nodes.add(cur_node)
            for neigh, weight in g[cur_node]:
                if (cur_node, neigh) in visited_edges:
                    continue
                visited_edges.add((cur_node, neigh))
                if M - cur_steps <= weight:
                    counts[(cur_node, neigh)] = M - cur_steps
                else:
                    counts[(cur_node, neigh)] = weight
                    heapq.heappush(h, [cur_steps + weight + 1, neigh])
        ret = len(visited_nodes)
        for i, j, n in edges:
            ret += min(n, counts[(i, j)] + counts[(j, i)])            
        return ret

Comments