#P16975. [SGU427] Hamiltonian polyhedron

[SGU427] Hamiltonian polyhedron

题目描述

给定一个凸多面体。已知这个多面体所有顶点的立体角之和小于 44 球面度(完整球面的立体角为 4π4\pi)。

请判断多面体的棱图中是否存在一个哈密顿环:这个环必须恰好经过每个顶点一次,并且环上的每一条边都必须是多面体的一条棱。每条棱至多使用一次,可以有一些棱不被使用。

输入格式

第一行一个整数 ff,表示多面体的面数。

随后依次描述这 ff 个面。每个面的描述为:

  • 第一行一个整数 kk,表示这个面的顶点数;
  • 接下来 kk 行,每行三个实数 x,y,zx,y,z,表示一个顶点的坐标。

同一个面中的顶点按照该面的边界顺序给出,可能是顺时针,也可能是逆时针。

坐标均恰好保留 99 位小数。如果同一个顶点出现在多个面的描述中,那么它在所有位置出现时的坐标字符串完全相同。

保证:

  • 多面体的不同顶点总数不超过 100100
  • 面数 f100f\le100
  • 任意一个面的顶点数不超过 100100
  • 坐标的绝对值不超过 10001000
  • 任意两个不同顶点间的实际距离至少为 51075\cdot10^{-7}
  • 输入坐标是实际坐标四舍五入到小数点后 99 位得到的;
  • 多面体为凸多面体,且所有顶点立体角之和小于 44

输出格式

如果不存在满足要求的环,输出:

No

否则输出:

Yes
n
x1 y1 z1
x2 y2 z2
...
xn yn zn

其中 nn 是多面体的顶点总数,随后按环上的顺序输出每个顶点。

顶点坐标必须与输入中出现的形式完全一致,即仍然保留原来的 99 位小数。

最后一个输出顶点与第一个输出顶点之间也必须存在一条多面体的棱。

样例

4
3
100.146488845 0.000000000 0.000000000
100.145878719 0.349576483 0.000000000
-100.145878719 -0.349576483 0.000000000
3
33.382162948 0.000000000 1.219611194
100.146488845 0.000000000 0.000000000
100.145878719 0.349576483 0.000000000
3
33.382162948 0.000000000 1.219611194
100.145878719 0.349576483 0.000000000
-100.145878719 -0.349576483 0.000000000
3
33.382162948 0.000000000 1.219611194
-100.145878719 -0.349576483 0.000000000
100.146488845 0.000000000 0.000000000

一种合法输出为:

Yes
4
-100.145878719 -0.349576483 0.000000000
33.382162948 0.000000000 1.219611194
100.146488845 0.000000000 0.000000000
100.145878719 0.349576483 0.000000000