Contact
Back to Home

How can you implement a function to compute the longest path in a given DAG?

Featured Answer

Question Analysis

The question requires implementing a function to compute the longest path in a Directed Acyclic Graph (DAG). To solve this problem, you need to understand the following:

  • Directed Acyclic Graph (DAG): A graph that is directed and contains no cycles. This means it is a graph where you cannot start at one vertex and return to it by following the directed edges.

  • Longest Path in a DAG: In this context, the longest path is the path with the maximum number of edges. Unlike general graphs, finding the longest path in a DAG is feasible in polynomial time because of the absence of cycles.

  • Topological Sorting: This is a linear ordering of vertices such that for every directed edge u -> v, vertex u comes before v in the ordering. Topological sorting is a key component in finding the longest path in a DAG.

Answer

To find the longest path in a DAG, follow these steps:

  1. Topologically Sort the DAG: Perform a topological sort of the graph. This can be done using Depth First Search (DFS) or Kahn’s algorithm. The result is a linear ordering of vertices.

  2. Relax Edges in Topological Order: Initialize a distance array with negative infinity for all vertices except the source vertex, which should be initialized with zero. Then, iterate over the vertices in topological order and relax the edges. For each vertex u and its adjacent vertex v with edge weight w, update the distance to v as distance[u] + w if it's greater than the current distance[v].

Here is a Python implementation of this approach:

from collections import defaultdict, deque

def topological_sort(graph, num_vertices):
    indegree = [0] * num_vertices
    for u in graph:
        for v, _ in graph[u]:
            indegree[v] += 1

    queue = deque([i for i in range(num_vertices) if indegree[i] == 0])
    topo_order = []

    while queue:
        u = queue.popleft()
        topo_order.append(u)

        for v, _ in graph[u]:
            indegree[v] -= 1
            if indegree[v] == 0:
                queue.append(v)

    return topo_order

def longest_path_dag(graph, num_vertices, start_vertex):
    # Initialize distances with negative infinity
    distances = [-float('inf')] * num_vertices
    distances[start_vertex] = 0

    # Get the topological order
    topo_order = topological_sort(graph, num_vertices)

    # Relax the edges according to the topological order
    for u in topo_order:
        if distances[u] != -float('inf'):
            for v, weight in graph[u]:
                if distances[v] < distances[u] + weight:
                    distances[v] = distances[u] + weight

    return distances

# Example usage
graph = defaultdict(list)
# Assume graph is populated with edges (u, v, weight)
# Example: graph[0].append((1, 2)) for edge 0 -> 1 with weight 2

num_vertices = 5
start_vertex = 0
longest_paths = longest_path_dag(graph, num_vertices, start_vertex)

Key Points:

  • The algorithm is efficient with a time complexity of (O(V + E)), where (V) is the number of vertices and (E) is the number of edges.
  • Correctly implementing topological sorting is crucial for the solution.
  • Ensure the graph is a DAG, as this approach relies on the absence of cycles.