FLOYD - Floyd hoặc Dijkstra ( Cơ bản )

Tags: dijkstra, floyd, graph

Problem

https://vn.spoj.com/problems/FLOYD

https://oj.vnoi.info/problem/FLOYD

Cho đơn đồ thị vô hướng N đỉnh và M cạnh, trọng số các cạnh đều nguyên dương. Có 2 loại câu hỏi :
0 u v : Cho biết đường đi ngắn nhất từ u tới v có độ dài là bao nhiêu.
1 u v : Hãy chỉ ra 1 đường đi ngắn nhất từ u => v
Bài cơ bản này nhằm kiểm tra kỹ năng xây dựng các module chương trình con dành cho truy vết 1 cách hợp lý, sử dụng nhuần nhuyễn chương trình con, lời gọi hàm .

Download test và solution tại đây

Input

Dòng 1 : 3 số nguyên N , M , K . ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ N*(N-1)/2 , 1 ≤ K ≤ 1000 )
M dòng tiếp theo , dòng thứ i gồm 3 số nguyên dương u , v , c cho biết cạnh (u,v) có trọng số là c ( 1 ≤ c ≤ 10000 )
K dòng tiếp theo là K câu hỏi , dòng thứ j sẽ có định dạng như đã nêu ở trên .

Output

Ứng với mỗi câu hỏi trong K câu hỏi thì ta phải trả lời trên mỗi dòng như sau .
Câu hỏi 0 u v : Ghi ra 1 số nguyên duy nhất là độ dài đường đi ngắn nhất từ u -> v.
Câu hỏi 1 u v : Ghi ra số đầu tiên là số X là số đỉnh trên đường đi ngắn nhất này , tiếp đó ghi ra X số là chỉ số các đỉnh theo thứ tự xuất hiện trên hành trình .

Example

Input
3 3 2
1 2 3
2 3 1
1 3 5
0 1 2
1 1 3

Output
3
3 1 2 3

Tutorial

Đây là bài cơ bản về đường đi ngắn nhất, có thể dùng Dijkstra hoặc Floyd cũng được. Nhưng theo mình nên tối ưu trong mọi trường hợp, do đó dùng dijkstra + heap.

Nhận thấy rằng K <= 1000, nên tốt nhất dijkstra trước tất cả các đỉnh, sau đó mới xử lý truy vấn, dễ hiểu vì dijkstra 100 (tức N) lần hơn là dijkstra 1000 (tức K) lần.

Thuật dijkstra cải tiến với heap tốt nhất là code tay phần heap, thứ nhất luyện code nhanh, thứ hai code tay thì chạy nhanh hơn là dùng cái có sẵn (theo mình làm bài so sánh thời gian thì thấy vậy). Với C++ thì dùng cái có sẵn là priority_queue hoặc set, theo một số tài liệu cũng như trong khi mình làm bài thì set chạy chậm hơn priority_queue (do ảnh hưởng của thao tác xóa trên set). Lúc đi thi thì chẳng ai muốn code lại cái heap cả, nên hãy dùng thư viện có sẵn trong C++ :)


Submission

FLOYD.cpp