Chia các đỉnh của một đồ thị có hướng thành những nhóm cực đại sao cho hai đỉnh cùng nhóm khi và chỉ khi mỗi đỉnh đi tới được đỉnh kia; in số nhóm và nhãn của từng đỉnh. Các số nhãn không cần trùng với một cách đánh số cố định; chỉ phân hoạch các đỉnh phải đúng.
Input
Dòng đầu chứa n và m.
Mỗi trong m dòng tiếp theo chứa một cung uv, hướng từ u đến v.
Output
Dòng đầu in số thành phần liên thông mạnh k.
Dòng thứ hai in n nhãn; nhãn nằm trong [1,k], và hai đỉnh có cùng nhãn khi và chỉ khi thuộc cùng một thành phần liên thông mạnh.
Constraints
1≤n≤105.
0≤m≤2⋅105.
1≤u,v≤n.
Scoring
Subtask 1 (50% số điểm): n≤12vaˋm≤40.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
6 7
1 2
2 3
3 1
3 4
4 5
5 4
5 6
Output
3
1 1 1 2 2 3
Giải thích: Ba đỉnh 1,2,3 đi tới nhau; 4,5 tạo nhóm thứ hai; đỉnh 6 không quay lại nhóm trước nên đứng riêng. Vì vậy có ba thành phần mạnh.
Lời giải tóm tắt
Phân tích: Kosaraju với hai lượt DFS: lượt đầu lấy thứ tự kết thúc trên đồ thị gốc, lượt hai duyệt đồ thị đảo theo thứ tự ngược để gán SCC. Sau đó chuẩn hóa nhãn theo đỉnh nhỏ nhất của mỗi SCC.
Thuật toán: Kosaraju với hai lượt DFS: lượt đầu lấy thứ tự kết thúc trên đồ thị gốc, lượt hai duyệt đồ thị đảo theo thứ tự ngược để gán SCC. Sau đó chuẩn hóa nhãn theo đỉnh nhỏ nhất của mỗi SCC.
Chứng minh đúng: 1. Trong DAG ngưng tụ, SCC chứa đỉnh có thời điểm kết thúc lớn nhất ở lượt một không nhận được đường đi từ SCC chưa xử lý khi xét đồ thị đảo. 2. DFS lượt hai vì thế không thoát khỏi SCC đang lấy, đồng thời đạt được mọi đỉnh của SCC đó. 3. Lặp lại phủ mỗi đỉnh đúng một lần; chuẩn hóa chỉ đổi tên nhãn nên không đổi phân hoạch.