Kotlin Heroes: Episode 1 |
---|
Закончено |
Задан неориентированный граф, состоящий из $$$n$$$ вершин и $$$m$$$ ребер.
Напомним, что цикл — это путь, который начинается и заканчивается в одной и той же вершине. Цикл в графе называется простым, если он содержит каждую вершину (за исключением стартовой и конечной) не более одного раза (стартовая и конечная всегда содержится дважды). Заметьте, что петли также считаются простыми циклами.
За один ход Вы можете выбрать любой простой цикл в этом графе и удалить ребра, соответствующие этому циклу (соответствующие вершины остаются в графе). Разрешается удалять петлю или две копии одного ребра (см. тестовые примеры).
Ваша задача — применить некоторую последовательность ходов, чтобы получить граф, в котором нет ребер. Минимизировать количество циклов не обязательно. Если это невозможно, выведите «NO».
Первая строка входных данных содержит два целых числа $$$n$$$ и $$$m$$$ ($$$1 \le n, m \le 2 \cdot 10^5$$$) — количество вершин и количество ребер в графе.
Следующие $$$m$$$ строк содержат ребра графа. $$$i$$$-я строка содержит $$$i$$$-е ребро $$$x_i, y_i$$$ ($$$1 \le x_i, y_i \le n$$$), где $$$x_i$$$ и $$$y_i$$$ — вершины, соединенные $$$i$$$-м ребром. Граф может содержать петли и кратные ребра.
Если невозможно разбить граф на простые циклы, выведите «NO» в первой строке.
Иначе выведите «YES» в первой строке. Во второй строке выведите $$$k$$$ — количество простых циклов в разбиении графа.
В следующих $$$k$$$ строках выведите сами циклы. $$$j$$$-я строка должна содержать $$$j$$$-й цикл. Сначала выведите $$$c_j$$$ — количество вершин в $$$j$$$-м цикле. Затем выведите цикл как последовательность вершин. Все соседние (последовательные) вершины в выведенном пути должны быть соединены ребром, которое не содержится в других циклах.
6 9 1 2 2 3 1 3 2 4 2 5 4 5 3 5 3 6 5 6
YES 3 4 2 5 4 2 4 3 6 5 3 4 1 3 2 1
4 7 1 1 1 2 2 3 3 4 4 1 1 3 1 3
YES 3 2 1 1 5 1 4 3 2 1 3 1 3 1
4 8 1 1 1 2 2 3 3 4 4 1 2 4 1 3 1 3
NO
Картинка, соответствующая первому тестовому примеру:
Название |
---|