Đề 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ụ
Đầ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.
Đầ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.