Articulation Points in Graph in DSA Python - Time & Space Complexity
We want to understand how the time needed to find articulation points changes as the graph grows.
Specifically, how does the algorithm's work increase when the number of nodes and edges increases?
Analyze the time complexity of the following code snippet.
def dfs(u, parent):
visited[u] = True
disc[u] = time[0]
low[u] = time[0]
time[0] += 1
children = 0
for v in graph[u]:
if not visited[v]:
children += 1
dfs(v, u)
low[u] = min(low[u], low[v])
if parent is None and children > 1:
articulation[u] = True
if parent is not None and low[v] >= disc[u]:
articulation[u] = True
elif v != parent:
low[u] = min(low[u], disc[v])
# Initialization and call
visited = [False] * n
articulation = [False] * n
disc = [float('inf')] * n
low = [float('inf')] * n
time = [0]
for i in range(n):
if not visited[i]:
dfs(i, None)
This code finds articulation points in a graph using DFS traversal and tracking discovery and low times.
- Primary operation: DFS visits each node and explores all its edges once.
- How many times: Each node is visited once, and each edge is checked once or twice.
As the number of nodes (n) and edges (m) grow, the algorithm visits each node and edge once.
| Input Size (n, m) | Approx. Operations |
|---|---|
| 10 nodes, 15 edges | About 25 operations |
| 100 nodes, 200 edges | About 300 operations |
| 1000 nodes, 5000 edges | About 6000 operations |
Pattern observation: Operations grow roughly in proportion to nodes plus edges.
Time Complexity: O(n + m)
This means the time grows linearly with the number of nodes and edges in the graph.
[X] Wrong: "The algorithm checks every possible path, so it must be exponential."
[OK] Correct: The DFS visits each node and edge only once, so it does not explore all paths repeatedly.
Understanding this linear time complexity helps you explain efficient graph traversal in interviews confidently.
"What if the graph was represented as an adjacency matrix instead of adjacency lists? How would the time complexity change?"
Practice
Solution
Step 1: Understand the definition of articulation point
An articulation point is a vertex in a graph whose removal disconnects the graph or increases the number of connected components.Step 2: Compare options with definition
A vertex that, when removed, increases the number of connected components matches this definition exactly. Other options describe different concepts.Final Answer:
A vertex that, when removed, increases the number of connected components -> Option CQuick Check:
Articulation point = vertex disconnecting graph [OK]
- Confusing articulation point with highest degree vertex
- Thinking articulation point forms cycles
- Assuming articulation point connects to all vertices
Solution
Step 1: Understand initialization purpose
The discovery time array stores the time when each vertex is first visited. Initializing with -1 means unvisited.Step 2: Check options
discovery = [-1] * n initializes all values to -1, indicating unvisited vertices. discovery = [0] * n sets all to 0, which can be confused with a valid time. discovery = list(range(n)) assigns increasing numbers, which is incorrect. discovery = None sets None, which is invalid for indexing.Final Answer:
discovery = [-1] * n -> Option BQuick Check:
Unvisited vertices marked as -1 [OK]
- Initializing discovery with zeros causing confusion
- Using range which sets wrong discovery times
- Setting discovery to None causing errors
graph = {0: [1, 2], 1: [0, 2], 2: [0, 1, 3], 3: [2, 4, 5], 4: [3, 5], 5: [3, 4]}Solution
Step 1: Analyze graph structure
Vertices 0,1,2 form a triangle (cycle). Vertex 3 connects this triangle to vertices 4 and 5, which form another cycle.Step 2: Identify articulation points
Removing vertex 2 disconnects vertex 3 and its connected cycle from the triangle. Removing vertex 3 disconnects vertices 4 and 5 from the rest. So articulation points are 2 and 3.Final Answer:
[2, 3] -> Option AQuick Check:
Vertices breaking connectivity = 2, 3 [OK]
- Ignoring articulation point at vertex 2
- Missing vertex 3 as articulation point
- Confusing cycle vertices as articulation points
def dfs(u, parent):
visited[u] = True
discovery[u] = time
low[u] = time
time += 1
children = 0
for v in graph[u]:
if not visited[v]:
children += 1
dfs(v, u)
low[u] = min(low[u], low[v])
if parent != -1 and low[v] >= discovery[u]:
articulation[u] = True
elif v != parent:
low[u] = min(low[u], discovery[v])
if parent == -1 and children > 1:
articulation[u] = TrueSolution
Step 1: Check variable usage in recursion
The variable 'time' is incremented inside dfs but not declared global or passed as argument, so increments won't persist across calls.Step 2: Verify other conditions
Conditions and increments for 'children' and articulation logic are correct. The 'elif' condition is also correct to update low values.Final Answer:
Variable 'time' is not declared global or passed, causing incorrect increments -> Option AQuick Check:
Global time needed for correct discovery times [OK]
- Not declaring 'time' global causing discovery errors
- Changing condition '>=' to '>' incorrectly
- Miscounting children in DFS
- Incorrectly checking parent in else condition
edges = [(0,1),(1,2),(2,0),(1,3),(3,4),(4,5),(5,3),(5,6)]Which vertices are articulation points?
Solution
Step 1: Analyze graph structure
Vertices 0,1,2 form a triangle (cycle). Vertex 1 connects to vertex 3, which connects to a cycle 3-4-5 and vertex 5 connects to 6.Step 2: Identify articulation points
Removing vertex 1 disconnects 3 and beyond from 0 and 2. Removing vertex 3 disconnects 4 and 5 from 1. Removing vertex 5 disconnects 6 from the rest. So articulation points are 1, 3, and 5.Final Answer:
[1, 3, 5] -> Option DQuick Check:
Vertices disconnecting parts = 1, 3, 5 [OK]
- Missing vertex 1 as articulation point
- Including leaf vertex 6 incorrectly
- Ignoring vertex 5's role in connectivity
Ready to prove it?
Pass the test and this pattern moves unknown
