:::info[结论 ] 若无向图 是一棵树,则一定不存在这样的一个数组 满足题目中给出的条件。 :::
:::warning[提示 ] 试着给树定根,然后自底向上递归处理度数信息? :::
::::success[证明结论 ] 考虑先给树随便定一个根。此时很显然叶子结点可以满足条件。
:::info[结论 ] 翻转一个结点 子树内所有边以及 和其父结点的边的方向不会影响 子树内除 结点以外的所有点的合法性。 :::
:::warning[提示 ] 考虑 子树内的结点入度和出度会怎么变化? :::
:::success[证明 ] 翻转一个结点 子树内所有的边后,对于 子树内一点 ,若满足 则 点操作前后一定是恰好交换了入度和出度的值。 :::
而对于非叶子结点的限制,考虑先递归处理其所有子结点 的子树条件,使得对于所有 都是满足条件的。
考虑先给每个子结点 的子树以及 的边随便定向使得 子树内所有结点的信息都是合法的。此时若 结点不合法,根据结论 可知此时翻转 子树内所有的边以及 的边不会导致 子树内任意一个点不再满足度数条件,而这样会导致 的入度和出度发生 或 的变化。容易发现必然存在一个调整方案使得 满足其度数条件。 ::::
:::info[结论 ] 若图 不是二分图,则必然存在一个数组 满足题目给出的条件。 :::
:::warning[提示 ] 试着构造一个特殊的 数组? :::
:::success[证明结论 ] 构造 。则此时要求一个点的入度或出度中至少有一个为 。
也就是对于一个结点 ,要么和其相邻的边全都是从 出发的,要么和其相邻的边全都是到达 的。
考虑按照这个条件把所有点 分为两类点:若 点相邻的所有边均从 出发,则称其为 类点,否则称其为 类点。
则根据两类点的定义可知,一条边定向后只可以是从 类点连向 类点的边,即在原图上只能存在连接 类点和 类点的边,不能存在一条边连接的两个点类别相同。因此若要存在一个定向方案满足条件,则图必须是一张二分图。
因此对非二分图,构造 就一定不满足题目中给出的度数条件。 :::
:::warning[提示 ] 是否只需要研究一类特殊的 数组就可以正确求解问题? :::
:::info[结论 ] 只需要研究形如 的数组 即可。 :::
:::::success[证明结论 ] 先考虑若一个序列 中只有一个位置 的值可以不为 ,定向后得到的有向图会形如什么样。容易想到这张图除了 结点以外,每个结点要么和其相邻的所有边都从她出发,要么和其相邻的所有点都连向她。
::::warning[提示 ] 如果翻转树上两个点 的简单路径上所有边的方向,那么点度数的信息会发生怎样的变化? ::::
::::success[提示 的答案] 容易发现若 到 路径上的点按照顺序可以写作为 ,则 点的入度和出度都不会发生变化。而 两点的入度要么增加 要么减少 ,出度则刚好相反。 ::::
考虑对于一个不合法的序列 ,记位置 满足 ,则考虑每次选择两个非零点 然后通过提示 中给出的操作把 上度数不为 的部分转移到 上即可。且因为这个转移操作只需要把 路径上所有边的方向翻转,因此设得到的新序列 ,则 不合法的充要条件即为 不合法,反之同理。 :::::
(这里只讨论 是二分图且不是树的情况)此时特判掉 序列全 的特殊情况,则对于给定的图 ,考虑固定 点,满足 。此时考虑在图 中删除 点以及所有一端为 点的边,则此时:
:::info[结论 ] 二分图删除一个结点和该结点相邻的边后,得到的新图仍然是一张二分图。 :::
:::info[结论 ] 若一张二分图中所有结点对应的 值都为 ,则确定一个点的入度为 / 出度为 后,一定可以确定整个连通块内每个点入度为 / 出度为 。 :::
:::success[证明结论 ] 确定二分图连通块内一个点入度为 / 出度为 后,一定可以通过二分图染色的方式,使得同色的点一定同时满足入度为 / 出度为 。而二分图染色确定一个点的颜色后一定可以唯一确定该点所在连通块内其余点的颜色。因此此时染色方案一定唯一,可以唯一确定。 :::
:::info[结论 ] 点向同一个连通块内连的边的方向一定全部相同,即:要么全都是从 出发,要么全都是连向 点。 :::
:::success[证明结论 ] 考虑到二分图删掉若干点后仍然会得到一个二分图,而且二分图一定不存在任何奇环,而除了 点以外的所有点都要么全是从 出发的边,要么边全都连向 点。考虑到前面提到过二分图染色后颜色相同的点必须全都是从 点出发的边或者全都是连向 点的边,因此 点向同一个连通块内连的边的方向必然全都相同。 :::
此时考虑记 点删除后各个连通块内和 点有边相连的点的数量分别为 ,则问题可以被转化为可重集合 中是否对于任意一个整数 都存在一个子集 满足 。此时考虑 P15253 Raining Mex 的经典结论:
:::info[结论 ] 可重集合 中对任意一个整数 都存在一个子集 满足 ,当且仅当把 数组内元素升序排序后,对任意 都有 。 :::
::::success[证明结论 ] 首先把 数组内元素升序排序。此时考虑套路的数学归纳,若当前处理的一段前缀内元素恰好可以凑出 的值,当前要加入的元素值为 ,则:若 ,则很显然此时可以凑出的元素的值为 ,否则此时无法凑出值在 的元素。但是为什么在某个时刻出现无法凑出的值,后面就再也无法凑出这些值了呢?
:::info[结论 ] 对于一个升序排列长度为 的数组 ,若在某个时刻能够凑出的值不是一段连续的区间,则在之后无论怎么插入元素都不会使得能凑出的值是一段连续的区间。 :::
:::success[证明结论 ] 考虑第一次出现不是一段连续区间前,能凑出值为 的元素,插入了元素 ,则必有 。此时无法凑出值为 的元素。而在后面加入的所有元素其值都不会小于 ,更不会小于 ,自然也无法凑出值为 的元素。而显然能凑出元素的上界就是当前所有元素的和,而这个和显然是严格大于 的。 :::
因此可以证明前面给出的条件就是充要条件。 ::::
于是得到了一个时间复杂度为 的做法:特判掉二分图和树的情况,然后考虑枚举点 作为序列 中唯一的非零点,求出删除点 后每个连通块和点 有边相连的点的数量 ,排序(这里排序可以使用桶排)后通过结论 判断点 是否合法即可。显然输出 No 当且仅当对于每个 , 都可以凑出值在 内的元素。
考虑进一步优化该算法的时间复杂度。考虑若一个点 不是原图的割点,则原图删掉点 和与其相邻的所有边后仍然得到一张二分图,且图仍然是连通的。此时 点相邻的所有点,每个点相邻的边的方向都必须是相同的,且做二分图染色后这些和 相邻的点的颜色必然是相同的,因此这些点和 点之间的边方向必须全部指向 或者全部从 出发,也就是此时因为 所以只能有 ,这个情况是平凡的,无需通过上面的方法讨论。因此直接在图上求出所有的割点然后把这些点依次设为 直接枚举和 点相邻的每条边即可。总时间复杂度为 ,可以通过该题。
喜欢的话,留下你的评论吧~