CFCF2208D2.Tree Orientation (Hard Version)
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是该问题的难度较高版本。两个版本的区别在于本版本中 n 的约束更大。只有在你完成了此问题的所有版本后,才能进行 hack。
你曾经拥有一棵包含 n 个节点的无向树。为了让这棵树变得更加有趣,你打算随意给每条 n−1 条边赋予一个方向。
时光流逝,你已经忘记了你的树的结构。但你发现了一张记录,在所有边被赋予方向后,对于每一组有序对 (u,v) 满足 1≤u,v≤n,都标记了 u 是否能够到达 v。
你想根据这份信息,推断出可能的树的结构以及边的方向。如果有可能,请构造出任意一种解;如果有多个解,只需给出其中一种即可。
对于有向图,如果存在一组节点序列 u1,u2,…,uk,使得 u1=x,uk=y,并且对所有 i 从 2 到 k,有有向边 ui−1→ui 存在,则称 x 可以到达 y。特别地,一个节点总可以到达它自己。
输入格式
每个测试点包含多组测试用例。第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
每个测试用例第一行包含一个整数 n(2≤n≤8000),表示你的树有 n 个节点。
接下来的 n 行,每行包含一个长度为 n 的字符串 si,仅包含字符 0 和 1。如果第 j 个字符为 1,表示 i 能在边定向后到达 j。
保证所有测试用例的 n2 之和不超过 80002。
输出格式
对于每个测试用例,如果存在解,输出 Yes,否则输出 No。如果答案是 Yes,则在下一行输出你构造的边。
共输出 n−1 行,每行两个正整数 x 和 y,表示有一条定向后的有向边 x→y。如果有多种方案,输出任意一种即可。
你可以用任意大小写输出答案(比如 "yEs", "yes", "Yes", "YES" 都可以被识别为肯定回答)。
输入输出样例
输入#1
11 4 1000 1111 1010 0001 4 1111 0111 0010 0111 4 0011 0111 0011 0001 4 1000 0110 0010 1111 4 1000 0110 1010 1111 5 10000 01011 00111 00010 00001 5 10000 11000 10101 10111 00001 5 10000 01101 00100 01110 10001 4 1100 0100 0011 0001 4 1110 0100 0010 0101 3 100 111 101
输出#1
Yes 2 3 2 4 3 1 No No Yes 2 3 4 1 4 2 No No Yes 2 1 3 1 3 5 4 3 No No Yes 1 2 1 3 4 2 Yes 2 3 3 1
说明/提示
对于第一个样例,节点 1 和 4 只能到达自身,节点 2 可以到达所有节点,节点 3 只能到达 1 和 3。所构造的边满足这些约束。
对于第二个样例,可以证明不存在可行解。