#781. Đường đi ngắn nhất nguồn đơn (SSPART)

Bộ nhớ: 512 MiB Thời gian: 1000 ms Nhập/xuất từ luồng chuẩn
Kiểu bài: Thông thường Kiểu chấm: So sánh văn bản
Đưa lên bởi: Trùm CUỐI

Đề bài

Dữ liệu đầu vào cho một đồ thị có hướng có trọng số gồm N nút và M cạnh. Yêu cầu bạn viết chương trình để xác định xem trong đồ thị này có tồn tại chu trình âm (negative cycle) hay không. Nếu từ một điểm xuất phát đi theo một đường dẫn nào đó và quay lại chính nó, mà tổng trọng số các cạnh đi qua nhỏ hơn 0 , thì đường đó được gọi là một chu trình âm.

Nếu tồn tại chu trình âm, chỉ xuất ra một dòng chứa số -1 . Nếu không tồn tại chu trình âm, hãy tính độ dài đường đi ngắn nhất từ một điểm S cho trước đến tất cả các điểm khác. Quy ước: khoảng cách từ S đến S 0 , nếu S không liên thông với điểm nào đó thì xuất NoPath.

Dữ liệu:

  • Dòng đầu tiên chứa ba số nguyên dương, lần lượt là số điểm N , số cạnh M , và điểm nguồn S .
  • M dòng tiếp theo, mỗi dòng chứa ba số nguyên a, b, c , biểu thị có một cạnh nối từ điểm a đến điểm b với trọng số là c .

Kết quả:

  • Nếu tồn tại chu trình âm, chỉ xuất ra một dòng -1 . Ngược lại, xuất theo định dạng sau:
  • Gồm N dòng, dòng thứ i mô tả đường đi ngắn nhất từ S đến i :
    • Nếu S i không liên thông, xuất NoPath.
    • Nếu i = S , xuất 0 .
    • Các trường hợp khác, xuất độ dài đường đi ngắn nhất từ S đến i .

Ví dụ:

Dữ liệu:

6 8 1
1 3 4
1 2 6
3 4 -7
6 4 2
2 4 5
3 6 3
4 5 1
3 5 4

Kết quả:

0
6
4
-3
-2
7

Giới hạn: 2\le N\le 1000, 1\le M\le 10^5, 1\le a,b,S\le N, |c|\le 10^6 .