#P15782. 唯一配对审判

唯一配对审判

  • 来源:48th Petrozavodsk Programming Camp, Winter 2025, Day 2: National Taiwan U Contest,Problem J
  • 原题名:Judge Error
  • 时间限制:2 秒
  • 空间限制:1024 MiB

题目描述

某场本地程序设计竞赛曾经发生过一次令人难忘的事故。出题人达里安设计了一道构造题:给定 NN,要求构造一个含 NN 个顶点的简单无向图,使得图中恰好存在一个完美匹配,并且在这个条件下边数尽可能多。两个完美匹配若使用的边集合不同,则认为它们不同。

当时,另一位出题人贝尔说服达里安相信存在一个 O(N3)O(N^3) 的校验算法,于是数据范围被设到了 N500N\le 500。临近封题时,贝尔才发现那个算法并不正确,校验器可能需要 O(N4)O(N^4)。达里安虽然改写了校验器,却没有降低数据范围,因为测试时似乎跑得还够快。

正式比赛中,某份提交让这个校验器运行了十几秒,最终触发了评测系统错误。现在,评测组希望你写出一个更快、更可靠的校验程序;同时,我们把问题推广到 N2000N\le 2000

给定一个简单无向图的邻接矩阵,请判断它是否恰好包含一个完美匹配。如果是,请输出这个唯一的完美匹配;否则输出 No

输入格式

第一行包含一个整数 NN,表示顶点数量。

接下来 NN 行,第 ii 行包含一个长度为 NN 的二进制字符串

gi,1gi,2gi,N.g_{i,1}g_{i,2}\ldots g_{i,N}.

这些字符串共同描述图:当且仅当 gi,j=1g_{i,j}=1 时,顶点 ii 与顶点 jj 之间有边。

输出格式

如果给定图不恰好包含一个完美匹配,输出一行:

No

否则,第一行输出:

Yes

接下来输出 N2\frac{N}{2} 行,第 ii 行输出两个整数 ui,viu_i,v_i,表示匹配中的一条边,并满足 1ui<viN1\le u_i<v_i\le N

若存在唯一完美匹配,请按照

u1<u2<<uN/2u_1<u_2<\cdots<u_{N/2}

的顺序输出这些匹配边。

数据范围

  • 2N20002\le N\le 2000
  • NN 为偶数;
  • 对所有 ii,有 gi,i=0g_{i,i}=0
  • 对所有 i,ji,j,有 gi,j=gj,ig_{i,j}=g_{j,i}
  • 输入图为简单无向图。

样例 1

输入

4
0100
1010
0101
0010

输出

Yes
1 2
3 4

样例 2

输入

4
0101
1010
0101
1010

输出

No