H. Конденсация целиком
Найдите компоненты сильной связности и занумеруйте их так, чтобы для каждого ребра номер компоненты начала был не больше номера компоненты конца. То есть топологически отсортируйте конденсацию.
Таких нумераций обычно много. Чтобы ответ был единственным, договоримся: нумерация — это лексикографически наименьшая топологическая сортировка конденсации, где компоненты сравниваются по наименьшей входящей в них вершине.
Иначе говоря: постройте конденсацию, сопоставьте каждой компоненте её наименьшую вершину и запустите алгоритм Кана с кучей по этому ключу.
Полезно знать и другое: алгоритм Косарайю нумерует компоненты в порядке убывания времени выхода, а это уже топологический порядок конденсации — просто не обязательно наименьший. Так что если бы условие разрешало любую нумерацию, второй шаг был бы не нужен вовсе.
Формат ввода
Первая строка содержит числа () и ().
Далее идут строк с рёбрами. Возможны кратные рёбра и петли.
Формат вывода
В первой строке — число компонент .
Во второй — чисел: номер компоненты каждой вершины.
Примеры
10 19 1 4 7 8 5 10 8 9 9 6 2 6 6 2 3 8 9 2 7 2 9 7 4 5 3 6 7 3 6 7 10 8 10 1 2 9 2 7
2 1 2 2 1 1 2 2 2 2 1
4 2 3 4 1 2
4 1 2 3 4