#P15919. [Roi2021]树上的小组件

[Roi2021]树上的小组件

题目描述

Vasya 最近发明了一个新游戏。考虑一个连通有向图,它有 nn 个顶点和 2(n1)2(n-1) 条有向边,并且对于每条边 (u,v)(u,v),都存在反向边 (v,u)(v,u)。换句话说,这个图由一棵无向树得到:把树上的每条无向边拆成两个方向相反的有向边。

定义一个小组件为一对边 (e1,e2)(e_1,e_2),满足 e1e_1 的终点等于 e2e_2 的起点,或者反过来 e2e_2 的终点等于 e1e_1 的起点。特别地,一对方向相反的边也构成一个小组件。

Vasya 的游戏是把图中的所有有向边划分成若干个不相交的小组件。对于原始完整图,他当然可以做到。

后来,Vasya 的朋友 Petya 从图中删除了 2k2k 条有向边。于是图中剩下

m=2(n1)2km=2(n-1)-2k

条有向边。

现在 Vasya 想知道,剩下的有向边能否划分为若干个不相交的小组件;如果可以,还需要给出一种划分方案。

第一个样例中的小组件划分示意图。

输入格式

第一行包含两个整数 n,mn,m,表示顶点数和剩余有向边数。保证 mm 为偶数。

接下来 mm 行,每行包含两个整数 ui,viu_i,v_i,表示一条剩余有向边的起点和终点。

输出格式

如果无法划分,输出:

No

否则,先输出:

Yes

然后输出 m/2m/2 行,每行包含 4 个整数,表示一个小组件中的两条边:

u1 v1 u2 v2

其中 (u1,v1)(u_1,v_1)(u2,v2)(u_2,v_2) 是该小组件中的两条有向边。

数据范围

2n150000,2m2n22\le n\le 150000, \qquad 2\le m\le 2n-2

保证 mm 为偶数。

样例 1 输入

5 6
1 2
2 1
1 5
2 3
2 4
4 2

样例 1 输出

Yes
1 2 2 3
2 1 1 5
2 4 4 2

样例 2 输入

4 4
2 1
2 3
2 4
4 2

样例 2 输出

No

样例 3 输入

4 4
1 2
2 1
3 4
4 3

样例 3 输出

Yes
1 2 2 1
3 4 4 3

说明

第一个样例的划分见原题示意图。

本题输入规模较大,建议使用较快的输入输出方式。

子任务

子任务 分值 限制 依赖 检查信息
1 7 n20, m20n\le 20,\ m\le 20 U 第一处错误
2 10 n200n\le 200 U, 1
3 11 n3000, m=2n4n\le 3000,\ m=2n-4
4 29 n3000n\le 3000 U, 1-3
5 11 n150000, m=2n4n\le 150000,\ m=2n-4 3
6 32 n150000n\le 150000 U, 1-5