题解 构造题

传送门

因为我还没调出来先放上 lxl 的题解

duliu

然而名字叫做duliu只是为了恐吓选手

算法1

直接 \(2^n\times poly(n)\) DP即可。

算法2

考虑树上怎么做。

首先,最多只能剩一个叶子在最开始没选,否则在染到另一个叶子的父亲时白点会不连通。

我们把点权最大的那个叶子提根,剩下每个叶子都必须在最开始被选。构方案只需要不断剥叶子即可,可以保证始终连通。

算法3

我们从树上的做法得到启发,猜想对原图建出点双树后,只有一个叶子点双最开始没有被选,同时这个叶子是所有叶子中最小权值最大的。

首先这肯定是必要的,否则在剥到这个叶子点双时会不连通;接下来我们只需要构造证明即可。

仍然考虑把那个叶子提根,之后不断剥剩下的叶子。这样我们唯一需要实现的问题是,在一个点双内给定最开始被染黑的点(只有一个)、需要在最后一个才被染黑的点,求一组合法方案使得它满足题目中所描述的条件。

对于这个问题,只需要每一步尝试染黑一个点,如果能染就染即可。证明也是简单的,因为剩下白点的导出子图构成的每一个点双中都有至少一个黑点与它相邻,就可以归纳证明了。

直接模拟上述做法,我们需要剥 \(n\) 轮,每剥一次要检验 \(n\) 个点,每检验一个点需要 \(O(n)\) 复杂度。这样就得到了一个 \(O(n^3)\) 的做法。(我们认为 \(n,m\) 同阶)

算法4

上面那个做法实际上不需要每次对每一个点都检验一遍。对于每一轮,我们跑出白点导出子图中所有的割点,那么割点就是不能剥的,非割点就是能剥的。复杂度 \(O(n^2)​\)

算法5

对于仙人掌、2-Fc、网格图,只需要对每一个点双简单讨论即可。

算法6

优化算法4,发现我们实际上要操作的是删边维护割点。使用维护动态图双连通性的算法即可。

复杂度 \(O(n*poly(logn))\)

对于0-Fc,1-Fc,2-Fc的情况,你也可以写棵ABF来代替一般的动态图双连通性

算法7

根据前述分析,我们只需考虑原图是点双连通分量的情况,不过这时相对于原问题,会要求起点和终点均固定。

我们先找出整张图的一棵生成树,然后对于每个叶子,我们保留它最浅的一条返祖边。

这样,每个叶子就都变成了二度点。

对于二度点,一个自然的思路是先将其删除,在还原方案的时候,如果他的邻居被染黑了,那么他自己也要立刻被染黑。

我们再对每个点\(u\)开一个 vector<int> ,用于存储所有点\(v\),满足点\(v\)作为二度点被删除的时候,点\(u\)是点\(v\)的邻居。

这样,我们就可以删除所有叶子啦!

如此不断操作下去,就可以处理完整张图,注意生成树中起点到终点的链需要额外特判。

关于这个算法的正确性证明,只需简单归纳即可。

复杂度\(O(n)\)

[========]

posted @ 2022-01-17 21:48  Administrator-09  阅读(4)  评论(0编辑  收藏  举报