Khó 0 đã giải Tỷ lệ chấp nhận 0%

Longest Path in a DAG

Find the heaviest path in a task dependency graph.

Bạn sẽ học được gì

  • Sắp xếp công việc bằng sắp xếp tô pô
  • Nới lỏng cạnh theo thứ tự đó
  • Tìm đường đi nặng nhất trong DAG

Đề bài

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).

Ràng buộc

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

Ví dụ

Ví dụ 1
Đầu vào:
n = 4
edges = [
    [0, 1, 3],
    [0, 2, 2],
    [1, 3, 4],
    [2, 3, 6]
]

Kết quả mong đợi:
expected = 8
Đầu vào:
long long n = 4;
std::vector<std::vector<long long>> edges = {
    {0, 1, 3},
    {0, 2, 2},
    {1, 3, 4},
    {2, 3, 6}
};

Kết quả mong đợi:
long long expected = 8;
Đầu vào:
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}
};

Kết quả mong đợi:
long expected = 8;

Giải thích

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

Ví dụ 2
Đầu vào:
n = 3
edges = []

Kết quả mong đợi:
expected = 0
Đầu vào:
long long n = 3;
std::vector<std::vector<long long>> edges = {};

Kết quả mong đợi:
long long expected = 0;
Đầu vào:
long n = 3;
long[][] edges = new long[][] {};

Kết quả mong đợi:
long expected = 0;

Giải thích

Without edges every path has length 0.

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

Vì đồ thị không có chu trình, mỗi đỉnh có thể được chốt sau khi tất cả đỉnh trước nó đã được xử lý.

Gợi ý 2

Sắp xếp topo các đỉnh, rồi relax các cạnh đi ra để xây dựng độ dài đường đi tốt nhất tới từng đỉnh.

Gợi ý 3

Nếu đồ thị có nhiều thành phần hoặc không có cạnh, đáp án vẫn phải phản ánh độ dài đường đi có thể đạt được lớn nhất.

Độ phức tạp mong đợi

thời gian O(n + m), bộ nhớ phụ O(n + m)

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.