#P9084. 「HNOI2021 省集 Day5」树

「HNOI2021 省集 Day5」树

题目描述

给定一张 nn 个点 mm 条边的无向连通图和这张图的一棵生成树 T1T_1保证给定的图满足删掉任意一个点和它连接的所有边之后,这张图还是连通的。

现在你想要 T1T_1 更换成图上的另外一棵生成树 T2T_2,你可以进行如下操作:

  1. 选中 T1T_1 中的一个叶子 xx
  2. 选择原图上一个的点 z (zx)z\ (z \not= x) 满足 zzxx 在原图上相连,将 T1T_1 中的 xx 和它的父亲之间的边断开,然后连接 xxzz

你想知道能否将 T1T_1 变成 T2T_2,如果能,请你构造一个方案。

输入格式

第一行两个正整数 n,mn, m 表示图的点数和边数。

接下来 mm 行四个整数 x,y,f1,f2x, y, f_1, f_2 描述图上的一条边,f1,f2f_1, f_2 分别表示这条边是否在 T1,T2T_1, T_2 上。

输出格式

如果不能,输出 No

否则第一行输出 Yes,第二行输出一个正整数 kk 表示操作步数。

接下来 kk 行,每行两个正整数 x,zx, z,表示将 xx 和其父亲断开,然后连接 xxzz

样例

样例 1

8 9
1 2 1 1
2 3 1 1
3 4 1 1
4 5 1 0
5 6 1 1
6 7 1 1
7 8 1 1
8 1 0 0
2 7 0 1
Yes
5
1 8
2 7
3 2
4 3
1 2

说明

本题使用 SPJ 进行评测。

下发文件中给出了 checker.cpp,使用方法是 ./checker <input-file> <output-file> <answer-file>

如果输出文件的 YesNo 和答案文件给出的不一致,checker 会给出 Wrong Answer [1]

如果在你的某次输出中出现了 z=xz = x 的情况,会给出 Wrong Answer [2]

如果在某次输出中 xx 不是叶子节点,会给出 Wrong Answer [3]

如果 (x,z)(x, z) 这条边没有在原图上出现过,会给出 Wrong Answer [4]

如果最后操作完的树不是 T2T_2,会给出 Wrong Answer [5]

否则会给出 Accepted!

测试点约束

对于 100%100\% 的数据,3n1003\le n\le100mn×(n1)2m\le \frac{n\times (n-1)}{2},保证图没有重边和自环。

子任务编号 nn\le 分值
11 33 1010
22 44
33 55
44 66
55 77
66 99
77 1111
88 1313
99 1515
1010 100100