Back to challenges
Hard 0 solved 0% acceptance

Longest Path in a DAG

Find the heaviest path in a task dependency graph.

What you'll learn

  • Order tasks with a topological sort
  • Relax edges in that order
  • Find the heaviest path in a DAG

Problem

Tasks 0..n−1 form a directed acyclic graph. Each edge [u, v, w] means task v can start w hours after task u. Find the length of the longest path (the critical path). Process nodes in topological order.

Implement longest_path(n, edges).

Input

n: The number of nodes. edges: Edges as [from, to, weight].

Output

Return the total weight of the longest path (0 if there are no edges).

Constraints

1 ≤ n ≤ 100,000; 0 ≤ edges ≤ 200,000; 1 ≤ weight ≤ 10,000; the graph has no cycles

Examples

Example 1
Input:
n = 4
edges = [
    [0, 1, 3],
    [0, 2, 2],
    [1, 3, 4],
    [2, 3, 6]
]

Expected output:
expected = 8
Input:
long long n = 4;
std::vector<std::vector<long long>> edges = {
    {0, 1, 3},
    {0, 2, 2},
    {1, 3, 4},
    {2, 3, 6}
};

Expected output:
long long expected = 8;
Input:
long n = 4;
long[][] edges = new long[][] {
    new long[] {0, 1, 3},
    new long[] {0, 2, 2},
    new long[] {1, 3, 4},
    new long[] {2, 3, 6}
};

Expected output:
long expected = 8;

Explanation

0→1→3 weighs 7, 0→2→3 weighs 8: the longest path is 8.

Example 2
Input:
n = 3
edges = []

Expected output:
expected = 0
Input:
long long n = 3;
std::vector<std::vector<long long>> edges = {};

Expected output:
long long expected = 0;
Input:
long n = 3;
long[][] edges = new long[][] {};

Expected output:
long expected = 0;

Explanation

Without edges every path has length 0.

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Because the graph has no cycles, each node can be finalized after all its predecessors are processed.

Hint 2

Topologically order the nodes, then relax outgoing edges to build the best path length to each node.

Hint 3

If the graph has multiple components or no edges, the answer should still reflect the longest reachable path weight.

Expected complexity

O(n + m) time, O(n + m) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.