Bạn cần hoàn thiện nhiều mạng liên kết độc lập. Trong mỗi mạng có N đỉnh và M liên kết. Một số liên kết đã có chiều cố định; những liên kết còn lại chưa được chọn chiều.
Hãy chọn chiều cho tất cả liên kết chưa định hướng sao cho sau cùng mọi liên kết đều có hướng và toàn bộ đồ thị không chứa chu trình có hướng. Chiều của một liên kết đã cố định không được thay đổi. Đồ thị ban đầu không nhất thiết liên thông.
Input
Dòng đầu chứa số nguyên T - số bộ dữ liệu độc lập.
Với mỗi bộ dữ liệu:
Dòng đầu chứa hai số nguyên N và M.
M dòng tiếp theo, mỗi dòng chứa ba số nguyên t,x,y:
t=1: liên kết đã có hướng từ x đến y;
t=0: liên kết chưa định hướng nối x với y.
Trong một bộ dữ liệu không có self-loop và không có hai liên kết cùng nối một cặp đỉnh, bất kể thứ tự hai đầu mút.
Output
Với mỗi bộ dữ liệu:
Nếu không thể hoàn thành đồ thị như yêu cầu, in một dòng duy nhất:
NO
Nếu có thể, in YES, sau đó in đúng M dòng. Mỗi dòng gồm hai số nguyên uv, biểu diễn một liên kết có hướng từ u đến v trong đồ thị hoàn chỉnh.
Mỗi liên kết ban đầu phải xuất hiện đúng một lần trong M dòng kết quả. Các liên kết đã có hướng phải giữ nguyên chiều. Thứ tự liệt kê các liên kết là tùy ý; nếu có nhiều cách định hướng hợp lệ, được phép in bất kỳ cách nào.
Constraints
1≤T≤2⋅104.
2≤N≤2⋅105 trong mỗi bộ dữ liệu.
1≤M≤min(2⋅105,N(N−1)/2) trong mỗi bộ dữ liệu.
t∈{0,1}.
1≤x,y≤N và x=y.
Không có hai liên kết trùng cặp đầu mút trong cùng một bộ dữ liệu.
Tổng N trên toàn input không vượt quá 2⋅105.
Tổng M trên toàn input không vượt quá 2⋅105.
Scoring
Subtask 1 (50% số điểm): ∑N≤100 và ∑M≤200.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
1
5 6
1 4 2
0 1 2
1 3 4
0 5 3
0 1 5
1 4 5
Output
YES
4 2
1 2
3 4
3 5
1 5
4 5
Giải thích: Các liên kết cố định tạo chuỗi 3→4→2 và cạnh 4→5. Định hướng ba liên kết còn lại như output cho một đồ thị không chu trình.
Test 2
Input
1
4 4
1 1 2
1 2 3
1 3 1
0 3 4
Output
NO
Giải thích: Ba liên kết cố định đã tạo chu trình 1→2→3→1; chọn chiều cho liên kết còn lại không thể loại bỏ chu trình này.
Lời giải tóm tắt
Ý tưởng: Chỉ các liên kết đã có hướng mới có thể khiến bài toán vô nghiệm ngay từ đầu. Bỏ qua tạm thời mọi liên kết chưa định hướng và tìm một thứ tự topo của phần đồ thị cố định.
Ý tưởng: Nếu không lấy được đủ N đỉnh, phần cố định có chu trình. Chu trình ấy vẫn tồn tại trong mọi đồ thị hoàn chỉnh, nên đáp án là NO.
Ý tưởng: Nếu có thứ tự topo, lưu vị trí pos[v] của từng đỉnh. Giữ nguyên mọi cạnh cố định. Với mỗi liên kết chưa định hướng {u, v}, hướng nó từ đỉnh có vị trí topo nhỏ hơn đến đỉnh có vị trí topo lớn hơn.
Ý tưởng: Sau bước này, mọi cạnh đều đi theo chiều tăng của pos, nên không thể có chu trình có hướng.
Tính đúng đắn:Bổ đề 1. Nếu phần cạnh cố định chứa chu trình có hướng thì không có lời giải.
Tính đúng đắn:Chứng minh. Không được đổi chiều bất kỳ cạnh nào của chu trình đó. Vì vậy chu trình vẫn xuất hiện sau khi định hướng các cạnh còn lại. ∎
Tính đúng đắn:Bổ đề 2. Nếu phần cạnh cố định là DAG, thuật toán luôn định hướng được mọi cạnh chưa có hướng.
Tính đúng đắn:Chứng minh. DAG có một thứ tự topo. Hai đầu của mỗi cạnh chưa định hướng có hai vị trí khác nhau; thuật toán chọn chiều từ vị trí nhỏ hơn sang vị trí lớn hơn, nên luôn xác định được đúng một chiều. ∎
Tính đúng đắn:Bổ đề 3. Đồ thị do thuật toán tạo ra không có chu trình có hướng.
Tính đúng đắn:Chứng minh. Cạnh cố định đi từ vị trí topo nhỏ đến lớn. Cạnh được định hướng bởi thuật toán cũng có tính chất đó. Dọc theo một đường đi có hướng, vị trí topo vì thế tăng nghiêm ngặt. Một chu trình phải quay về đỉnh đầu, điều này không thể xảy ra. ∎
Tính đúng đắn:Định lý. Thuật toán in NO đúng khi và chỉ khi không tồn tại cách định hướng hợp lệ; trong mọi trường hợp còn lại, các cạnh được in tạo thành một DAG và giữ nguyên toàn bộ chiều bắt buộc.
Tính đúng đắn:Chứng minh. Chiều “nếu” theo Bổ đề 1. Khi phần cố định không có chu trình, Bổ đề 2 cho biết thuật toán định hướng được tất cả cạnh và Bổ đề 3 chứng minh kết quả là DAG. ∎
Độ phức tạp: Mỗi bộ dữ liệu được xử lý trong O(N + M) thời gian và O(N + M) bộ nhớ. Trên toàn input, độ phức tạp là O(ΣN + ΣM).