DDSA Solutions

Mother Vertex

Advertisement

Intuition

A mother vertex in a directed graph is one from which all other vertices are reachable. A key insight: if a mother vertex exists, it will always be the last vertex to finish in a DFS traversal (due to the structure of the graph). So we find the last-finished vertex, then verify it by checking if all vertices are reachable from it.

Algorithm

  1. 1Build the adjacency list from the edge list.
  2. 2Run DFS from each unvisited vertex, tracking the last vertex to finish—this is the candidate.
  3. 3Reset the visited array.
  4. 4Run DFS from the candidate vertex.
  5. 5If all vertices are visited, the candidate is the mother vertex; otherwise, return -1.

Example Walkthrough

Input: V = 4, edges = [[0,1],[0,2],[1,3],[2,3]]

  1. 1.Adjacency: 0→[1,2], 1→[3], 2→[3], 3→[].
  2. 2.DFS traversal: visit 0, then 1, then 3 (finished 3), backtrack, visit 2 (finished 2), backtrack (finished 1), backtrack (finished 0).
  3. 3.Last finished vertex: 0.
  4. 4.Verify: DFS from 0 reaches 1, 2, 3. All 4 vertices reachable.
  5. 5.Return 0 (the mother vertex).

Output: 0

Common Pitfalls

  • Do not assume the first vertex with the highest out-degree is the mother; topology matters.
  • The last-finished vertex in DFS is the candidate only because of the directed acyclic structure; in cyclic graphs, revisit the approach.
  • After finding the candidate, always verify it; not all graphs have a mother vertex.
Mother Vertex.java
Java

import java.util.*;

// Approach: A mother vertex (if it exists) will be the last finished vertex in DFS traversal.
// First DFS pass: track all finished vertices, the last one is the candidate.
// Second DFS pass: verify the candidate by checking if all vertices are reachable from it.
// If verification succeeds, return the candidate; otherwise return -1.
// Time: O(V + E) Space: O(V)

class Solution {

    public int findMotherVertex(int V, int[][] edges) {
        // Step 1: Build adjacency list
        List<List<Integer>> adj = new ArrayList<>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<>());
        }
        for (int[] e : edges) {
            adj.get(e[0]).add(e[1]);
        }

        // Step 2: Do DFS to find candidate mother vertex
        boolean[] visited = new boolean[V];
        int candidate = -1;

        for (int i = 0; i < V; i++) {
            if (!visited[i]) {
                dfs(i, adj, visited);
                candidate = i; // last finished vertex
            }
        }

        // Step 3: Verify candidate by running DFS again
        Arrays.fill(visited, false);
        dfs(candidate, adj, visited);

        for (boolean v : visited) {
            if (!v) {
                return -1; // not all reachable

            }
        }

        return candidate;
    }

    private void dfs(int node, List<List<Integer>> adj, boolean[] visited) {
        visited[node] = true;
        for (int nei : adj.get(node)) {
            if (!visited[nei]) {
                dfs(nei, adj, visited);
            }
        }
    }
}
Advertisement
Was this solution helpful?