2022 年,台湾的一场程序设计竞赛中发生了一件糟糕的事情。一位出题人提出了以下问题:
给定一个数字 $N$,请构造一个具有 $N$ 个顶点的简单无向图,使得该图中恰好存在一个完美匹配,且在此条件下,边的数量尽可能多。如果两个完美匹配所使用的边集不同,则称这两个完美匹配是不同的。
当时,出题人 D 将 $N$ 的限制设为 $N \le 500$,因为另一位出题人 B 误导他,让他相信存在一种可以用来实现校验器的 $O(N^3)$ 算法。然而,就在题目提交截止日期前,B 意识到他的算法是错误的,并告知 D 他可能不得不改写一个 $O(N^4)$ 的算法。D 照做了,但他选择不降低 $N$ 的限制,仅仅是因为该算法看起来运行得足够快。
结果,在正式比赛期间,其中一份提交导致 $O(N^4)$ 的校验器运行了超过 10 秒,引发了评测系统的错误。之后发生的事情则是另一个故事了。
你能帮忙实现一个运行速度显著更快的校验器吗?哦,为了让事情更有趣,我们来解决推广版本,并将 $N$ 的上限提高到 2000。
输入格式
第一行包含一个整数 $N$:顶点数($2 \le N \le 2000$;$N$ 为偶数)。
接下来 $N$ 行。第 $i$ 行包含一个长度为 $N$ 的二进制字符串,记为 $g_{i,1}g_{i,2} \dots g_{i,N}$($g_{i,j} \in \{0, 1\}$)。这 $N$ 行共同定义了该图:当且仅当 $g_{i,j}$ 为 1 时,顶点 $i$ 与顶点 $j$ 相连。主对角线全为 0:对于所有 $i$,$g_{i,i} = 0$。矩阵是对称的:对于每一对 $(i, j)$,$g_{i,j} = g_{j,i}$。
输出格式
如果给定的无向图不包含恰好一个完美匹配(无需考虑最大边数),则输出一行 “No”。否则,第一行输出 “Yes”,随后输出 $\frac{N}{2}$ 行:第 $i$ 行应描述第 $i$ 个匹配对的端点 $u_i$ 和 $v_i$($1 \le u_i < v_i \le N$)。由于匹配可能有多种可能的顺序,请按 $u_1 < u_2 < \dots < u_{\frac{N}{2}}$ 的顺序输出匹配。
样例
样例输入 1
4 0100 1010 0101 0010
样例输出 1
Yes 1 2 3 4
样例输入 2
4 0101 1010 0101 1010
样例输出 2
No