Cho một đồ thị có hướng gồm n đỉnh, được đánh số từ 1 đến n. Mỗi cạnh có một độ dài nguyên dương. Từ đỉnh 1, luôn tồn tại ít nhất một đường đi tới mọi đỉnh còn lại.
Hãy tính độ dài đường đi ngắn nhất từ đỉnh 1 tới từng đỉnh của đồ thị.
Input
Dòng đầu chứa hai số nguyên n và m - số đỉnh và số cạnh.
Mỗi dòng trong m dòng tiếp theo chứa ba số nguyên a,b,c, biểu thị một cạnh có hướng đi từ a tới b với độ dài c.
Output
In n số nguyên. Số thứ i là độ dài đường đi ngắn nhất từ đỉnh 1 tới đỉnh
i.
Constraints
1≤n≤105.
1≤m≤2⋅105.
1≤a,b≤n.
1≤c≤109.
Có thể có khuyên và nhiều cạnh cùng hướng nối một cặp đỉnh.
Từ đỉnh 1 đi được tới mọi đỉnh.
Scoring
Subtask 1 (50% số điểm): n≤30 và m≤200.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Giải thích: Đỉnh 3 đạt được với độ dài 2, rồi cạnh 3−>2 cho khoảng cách đến 2 bằng 3. Đi tiếp qua 2−>4−>5 lần lượt cho khoảng cách 7 và 10, đều tốt hơn các đường trực tiếp còn lại.
Lời giải tóm tắt
Phân tích: Mỗi đỉnh cần giữ khoảng cách nhỏ nhất hiện biết từ đỉnh 1. Vì mọi cạnh có độ dài dương, khi đỉnh có nhãn nhỏ nhất được lấy khỏi hàng đợi ưu tiên thì không còn đường chưa xét nào có thể làm nhãn ấy nhỏ hơn.
Thuật toán: 1. Đặt dist[1] = 0, các khoảng cách khác bằng vô cùng. 2. Dùng hàng đợi ưu tiên chứa cặp (khoảng cách, đỉnh). 3. Mỗi lần lấy cặp nhỏ nhất. Nếu khoảng cách trong cặp không còn bằng dist[u], bỏ qua vì đó là bản ghi cũ. 4. Với mỗi cạnh u -> v độ dài w, nếu dist[u] + w < dist[v] thì cập nhật dist[v] và đưa nhãn mới vào hàng đợi.
Chứng minh tính đúng đắn: Xét lần một đỉnh u được lấy ra với giá trị đúng bằng dist[u]. Mọi đường chưa được xét đầy đủ tới u phải đi qua một đỉnh đang có nhãn không nhỏ hơn dist[u]. Do trọng số cạnh dương, phần còn lại không thể tạo ra khoảng cách nhỏ hơn dist[u]. Vì vậy nhãn của u khi đó là tối ưu. Mỗi phép nới lỏng ghi nhận độ dài của một đường hợp lệ, nên sau khi mọi đỉnh được xử lý, tất cả giá trị in ra đều đúng.
Độ phức tạp: Thời gian O((n + m) log n), bộ nhớ O(n + m).