Một hệ thống cần thực hiện đúng một lần mỗi lệnh mang số hiệu từ 1 đến n. Có m ràng buộc; ràng buộc ab yêu cầu lệnh a phải được thực hiện trước lệnh b.
Một lịch thực hiện hợp lệ là một hoán vị của các số từ 1 đến n thỏa mãn tất cả ràng buộc. Hãy tìm lịch hợp lệ nhỏ nhất theo thứ tự từ điển.
Hai dãy khác nhau được so sánh tại vị trí đầu tiên mà chúng khác nhau. Dãy có số nhỏ hơn tại vị trí đó là dãy nhỏ hơn theo thứ tự từ điển.
Input
Dòng đầu chứa hai số nguyên n và m.
Mỗi trong m dòng tiếp theo chứa hai số nguyên a và b, biểu thị rằng lệnh a phải xuất hiện trước lệnh b trong lịch.
Output
Nếu tồn tại lịch hợp lệ, in một dòng gồm n số của lịch nhỏ nhất theo thứ tự từ điển, theo đúng thứ tự thực hiện.
Nếu không tồn tại lịch hợp lệ, in một dòng duy nhất chứa −1.
Constraints
2≤n≤2⋅105.
1≤m≤2⋅105.
1≤a,b≤n và a=b với mọi ràng buộc.
Một cặp ràng buộc có thể xuất hiện nhiều lần.
Scoring
Subtask 1 (50% số điểm): n≤8 và m≤40.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
6 6
3 1
3 5
2 5
1 4
5 4
4 6
Output
2 3 1 5 4 6
Giải thích: Ở vị trí đầu tiên, chỉ 2 và 3 có thể được chọn nên ta lấy 2. Sau khi lấy tiếp 3, hai lệnh 1 và 5 cùng khả dụng; chọn 1 trước rồi lần lượt chọn 5,4,6 cho lịch nhỏ nhất là 231546.
Test 2
Input
4 4
1 2
2 3
3 1
4 2
Output
-1
Giải thích: Ba ràng buộc đầu buộc 1 đứng trước 2,2 đứng trước 3 và 3 lại đứng trước 1. Chu trình này khiến không có lịch nào thỏa mãn tất cả ràng buộc, nên kết quả là −1.
Lời giải tóm tắt
Ý tưởng: Mỗi ràng buộc a b được xem là một cạnh có hướng a → b. Một lệnh chỉ có thể được chọn khi mọi lệnh bắt buộc đứng trước nó đã được chọn, tức bậc vào hiện tại của đỉnh tương ứng bằng 0.
Thuật toán: 1. Tính bậc vào của mọi đỉnh và đưa tất cả đỉnh có bậc vào 0 vào một hàng đợi ưu tiên lấy phần tử nhỏ nhất. 2. Lặp khi hàng đợi còn phần tử: lấy nhãn nhỏ nhất, thêm vào đáp án, xóa các cạnh đi ra của nó và đưa những đỉnh vừa có bậc vào bằng 0 vào hàng đợi. 3. Nếu đã lấy đủ n đỉnh, in dãy thu được. Nếu không, phần còn lại chứa chu trình nên in -1.
Tính đúng đắn: Tại mỗi vị trí, mọi lịch hợp lệ của phần đồ thị còn lại đều phải bắt đầu bằng một đỉnh đang có bậc vào 0; chọn đỉnh khác sẽ vi phạm ít nhất một tiền đề chưa được xử lý. Thuật toán chọn nhãn nhỏ nhất trong toàn bộ tập hợp này, nên phần tử ở vị trí hiện tại nhỏ nhất có thể. Sau khi xóa đỉnh đã chọn, bài toán còn lại có cùng dạng. Áp dụng lập luận này cho từng vị trí chứng minh dãy thu được là lịch hợp lệ nhỏ nhất theo thứ tự từ điển.
Tính đúng đắn: Nếu thuật toán dừng trước khi lấy đủ n đỉnh, mọi đỉnh còn lại đều có bậc vào dương trong đồ thị còn lại; do đó tồn tại chu trình và không thể có lịch hợp lệ.
Độ phức tạp: Mỗi cạnh được xử lý một lần và mỗi đỉnh vào, ra hàng đợi ưu tiên một lần. Thời gian là O((n + m) log n) và bộ nhớ là O(n + m).