Step 1: Start DFS from node 1, assign discovery time and low value
Visited: 1 (disc=1, low=1)
Stack: [1]
Articulation Points: []
Why: We begin exploring the graph and mark the first node's discovery time
Step 2: Visit node 2 from 1, assign disc=2, low=2
Visited: 1 (disc=1, low=1), 2 (disc=2, low=2)
Stack: [1,2]
Articulation Points: []
Why: Explore unvisited neighbor 2
Step 3: Visit node 3 from 2, assign disc=3, low=3; find back edge to 1, update low[3]=1
Visited: 1(1,1), 2(2,2), 3(3,1)
Stack: [1,2,3]
Articulation Points: []
Why: Back edge 3-1 allows subtree to reach ancestor of 2, low[3] updated to disc[1]
Step 4: Visit node 4 from 3, assign disc=4, low=4
Visited: ... 4(4,4)
Stack: [1,2,3,4]
Articulation Points: []
Why: Node 4 is a leaf node
Step 5: Backtrack from 4 to 3, low[3]=min(1,4)=1; low[4]=4 >= disc[3]=3 && parent != -1, mark 3 as AP
Visited: ... 3(3,1)
Stack: [1,2,3]
Articulation Points: [3]
Why: No back edge from 4's subtree to ancestors of 3, so 3 is articulation point
Step 6: Visit node 5 from 3, assign disc=5, low=5
Visited: ... 5(5,5)
Stack: [1,2,3,5]
Articulation Points: [3]
Why: Node 5 is another leaf
Step 7: Backtrack from 5 to 3, low[3]=min(1,5)=1; low[5]=5 >= disc[3]=3, mark 3 as AP
Visited: ... 3(3,1)
Stack: [1,2,3]
Articulation Points: [3]
Why: No back edge from 5's subtree to ancestors of 3
Step 8: Backtrack from 3 to 2, low[2]=min(2,1)=1; low[3]=1 < disc[2]=2, do not mark 2
Visited: 1(1,1), 2(2,1), 3(3,1)
Stack: [1,2]
Articulation Points: [3]
Why: Subtree rooted at 3 can reach ancestors of 2 via back edge to 1
Step 9: Backtrack from 2 to 1, low[1]=min(1,1)=1; low[2]=1 >= disc[1]=1 but parent=-1 (root), do not mark; neighbor 3 is back edge, no update; root has 1 child, not AP
All visited
Articulation Points: [3]
Why: Root is not an articulation point as it has only one child in DFS tree
Result: Articulation Points: 3
Removing node 3 disconnects 4 and 5 from the rest