Coding questions · DoorDash
Design dynamic connectivity with alive nodes
This question evaluates understanding of dynamic graph data structures, connectivity algorithms, state management for node activation/deactivation, complexity analysis, and concurrent operation considerations.
Design a data structure to maintain an undirected graph of N nodes, where each node has a boolean 'alive' flag. Support the following operations efficiently for up to 100,000 operations: (1) activate(i) / deactivate(i) to toggle a node's alive status; (2) connect(u, v) that adds an edge only if both endpoints are currently alive; (3) disconnect(u, v) to remove an existing edge; (4) isConnected(u, v) that returns whether u and v are in the same connected component considering only alive nodes; and (5) countComponents() over alive nodes. Describe data structures, time/space complexities, and how you would handle deletions and node deactivations (e.g., lazy deletion vs. fully dynamic connectivity). Discuss any concurrency considerations if these operations are called from multiple threads.
Dynamic Connectivity with Alive Nodes
Simulate alive-node graph operations and return outputs for connectivity/count queries.
Examples
Example 1
Input: (4, [['activate',0],['activate',1],['connect',0,1],['isConnected',0,1],['countComponents'],['deactivate',1],['isConnected',0,1],['countComponents']])
Output: [None, None, None, True, 1, None, False, 1]
Explanation: Alive filtering.
Example 2
Input: (3, [['connect',0,1],['activate',0],['activate',1],['isConnected',0,1]])
Output: [None, None, None, False]
Explanation: Connect ignored while endpoints dead.
Hints
- Use deterministic tie-breaking for prompts with multiple valid outputs.
- For design-style APIs, simulate operations with explicit inputs.