canuc80k3409·10/50

Điểm Số Trên Hành Trình

Nộp bài trên LQDOJ

Bài 34 · Shortest Paths

Có đỉnh được đánh số từ đến và cạnh có hướng. Khi đi qua một cạnh, bạn nhận thêm số điểm ghi trên cạnh đó; số điểm này có thể âm, bằng hoặc dương.

Bạn bắt đầu tại đỉnh với điểm và cần kết thúc tại đỉnh . Một cạnh có thể được đi qua nhiều lần, vì vậy hành trình được phép lặp lại đỉnh và cạnh. Dữ liệu bảo đảm luôn có ít nhất một hành trình từ tới .

Hãy tìm số điểm lớn nhất có thể đạt được khi tới . Nếu có thể làm tổng điểm tăng lớn tùy ý rồi vẫn đi tiếp tới , hãy in .

Khi , hành trình rỗng với điểm là hợp lệ. Tuy nhiên, nếu từ đỉnh có thể đi qua một chu trình làm tăng điểm và quay về một vị trí còn tới được đỉnh , đáp án vẫn là không bị chặn.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi trong dòng tiếp theo chứa ba số nguyên , biểu thị một cạnh có hướng từ tới ; đi qua cạnh đó làm tổng điểm thay đổi thêm .

Output

  • Nếu tổng điểm có thể tăng không giới hạn, in .
  • Ngược lại, in tổng điểm lớn nhất hữu hạn của một hành trình từ tới . Giá trị hữu hạn này có thể là số âm.

Constraints

  • .
  • .
  • .
  • .
  • Cạnh tự khuyên và nhiều cạnh có cùng hai đầu mút đều được phép.
  • Luôn có đường đi có hướng từ tới .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4 5
1 2 4
2 4 -1
1 3 -2
3 4 8
2 3 1

Output

13

Giải thích: Hành trình nhận điểm, lớn hơn các hành trình và . Đồ thị không có chu trình giúp tăng điểm.

Test 2

Input

5 6
1 2 3
2 3 2
3 2 1
3 4 -5
4 5 4
1 5 0

Output

-1

Giải thích: Chu trình làm tổng điểm tăng thêm sau mỗi vòng. Từ chu trình vẫn có thể đi qua , nên số vòng lặp có thể tăng tùy ý và điểm tại đích không bị chặn.

Lời giải tóm tắt
  • Khi nào điểm không bị chặn?: Một chu trình dương chỉ ảnh hưởng đáp án khi thỏa cả hai điều kiện:
  • Khi nào điểm không bị chặn?: 1. chu trình đi được từ đỉnh 1; 2. từ chu trình còn đi tiếp được tới đỉnh n.
  • Khi nào điểm không bị chặn?: Điều kiện thứ nhất được thể hiện trực tiếp bởi nhãn điểm hữu hạn trong Bellman-Ford. Để kiểm tra điều kiện thứ hai, ta duyệt từ n trên đồ thị đảo và đánh dấu canReachN[v].
  • Bellman-Ford theo hướng tối đa hóa: Đặt score[1] = 0, các đỉnh khác là âm vô cùng. Với mỗi cạnh u -> v có điểm w, thử cập nhật
  • Bellman-Ford theo hướng tối đa hóa: score[v] = max(score[v], score[u] + w).
  • Bellman-Ford theo hướng tối đa hóa: Nếu không có chu trình dương hữu ích, một hành trình tối ưu có thể bỏ mọi chu trình không dương và còn nhiều nhất n-1 cạnh. Vì thế sau n-1 lượt, điểm tối ưu hữu hạn đã được tìm thấy.
  • Bellman-Ford theo hướng tối đa hóa: Nếu ở lượt thứ n vẫn có cập nhật tại một đỉnh v với canReachN[v] = true, chuỗi cạnh gây cập nhật chứa một chu trình dương đi được từ nguồn. Ta có thể lặp chu trình tùy ý rồi đi từ v tới đích, nên đáp án không bị chặn và phải in -1.
  • Bellman-Ford theo hướng tối đa hóa: Ngược lại, mọi chu trình dương đi được từ nguồn nhưng không thể tới n đều bị bộ lọc canReachN loại bỏ, nên không tạo kết luận sai.
  • Độ phức tạp: Thời gian O(nm), bộ nhớ O(n+m).