Задача №114769. Возвращение домой
Всего в стране \(n\) городов и \(m\) прямых двусторонних рейсов. Между парой городов может быть несколько двусторонних рейсов, может существовать двусторонний рейс между одним и тем же городом (некоторым людям просто нравится летать и читать книжку).
Сидя в самолёте Лёша подумал, как было бы хорошо если бы рейс из города \(A\) в город \(B\), а после из города \(B\) в город \(C\) превратился бы в один прямой рейс между городами \(A\) и \(C\), а рейсы \(AB\) и \(BC\) просто бы исчезли (сокращение \(AB\) означает рейс между городами \(A\) и \(B\)).
Так как Лёша любит решать различные задачи, а в самолете было скучно, он решил узнать можно ли, зная все рейсы в стране и последовательно используя операцию превращения существующих рейсов \(AB\) и \(BC\) в рейс \(AC\) с удалением рейсов \(AB\) и \(BC\), оставить всего один рейс в стране. При мысленном выполнении такой операции Лёша может выбирать любые два различных рейса, в том числе два двусторонних рейса между одной и той же парой городов или рейс между городом и им самим. Если при выполнении операции должен исчезнуть рейс \(AB\), а таких рейсов несколько, то рейс \(AB\) удаляется столько раз, сколько он используется в этой операции (то есть один или два).
Помогите Леше по заданным исходным рейсам между городами узнать можно ли при помощи применения произвольное число раз операции, описанной выше, оставить всего один рейс.
В первой строке через пробел записаны три числа \(n\), \(m\) и \(p\) (\(1 \leq n, m \leq 10^5\), \(p \in \{0, 1\}\)) — количество городов в стране, количество двусторонних рейсов между городами и нужно ли выводить последовательность операций, если можно оставить ровно один рейс.
В следующих \(m\) строках находятся пары вершин \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\)) — номера городов, между которыми проходит \(i\)-й рейс.
В первой строке выведите «NO», если нельзя оставить ровно один рейс. В противном случае выведите «YES».
Если \(p = 0\), то не нужно выводить последовательность операций при существовании ответа. Если же \(p = 1\), то далее выведите \(m - 1\) строк, в каждой строке через пробел должны быть записаны числа \(a_i\), \(b_i\) и \(c_i\) (\(1 \leq a_i, b_i, c_i \leq n\)), означающие номера городов, для которых рейсы \(a_ib_i\) и \(b_ic_i\) превращаются в \(a_ic_i\), а сами рейсы удаляются.
Тесты к этой задаче состоят из пяти групп. Баллы за каждую группу ставятся только при прохождении всех тестов группы и всех тестов необходимых групп.
Дополнительные ограничения | |||||
Группа | Баллы | \(n, m\) | \(p\) | Треб. группы | Комментарий |
0 | 0 | – | – | – | Sample tests. |
1 | 10 | \(n, m \leq 5\) | – | 0 | |
2 | 20 | \(n, m \leq 1000\) | – | 0, 1 | |
3 | 15 | \(n, m \leq 100\,000\) | – | – | Каждый город имеет не более \(2\) рейсов (если рейс идет из города в него самого, то он сам по себе рассматривается как \(2\) рейса для этого города) |
4 | 20 | \(n, m \leq 100\,000\) | \(p = 0\) | – | Вам нужно только вывести NO или YES, последовательность операций выводить не нужно даже в случае положительного ответа |
5 | 35 | – | – | 0 – 4 |
3 2 1 1 2 2 3
YES 3 2 1
3 3 1 1 2 2 1 1 1
YES 1 2 1 1 1 1
3 3 0 1 2 2 3 1 3
YES
4 6 1 1 2 2 3 3 4 4 1 1 3 2 4
NO