专栏文章

题解:P11834 [省选联考 2025] 岁月

P11834题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mip0jpxo
此快照首次捕获于
2025/12/03 04:11
3 个月前
此快照最后确认于
2025/12/03 04:11
3 个月前
查看原文
本题两大难点:
  1. 意识到题目中的条件就是缩点后 0 入度 SCC 恰好只有一个;
  2. 熟练掌握 DAG 容斥技巧,以及《主旋律》一题的解法;

观察到 C 性质部分分很多,大概率是完整解法的一个重要部分。首先考虑 C 性质如何解决。
现在所有边权都相等,那么就和最小生成树无关了,只需要有任何一棵外向生成树,图就合法。考虑所有可能成为生成树根的节点,很自然地观察到这些点应当组成一个 SCC,否则无法互相到达。进一步地,这个 SCC 应当是缩点后图中唯一的 00 入度 SCC。因此我们现在转化目标,枚举集合 SS,计算 SS 中点恰好组成唯一合法 SCC 的方案数 hSh_S
发现计算一个点集强连通的方案数是不可避免的。不妨设这个方案数为 fSf_S。这个问题就是《主旋律》,下面回顾一下这个问题的解法。
回忆 DAG 计数的过程:我们用“不断删除所有 00 入度点”的过程来刻画一个 DAG,并使用容斥系数 (1)k+1(-1)^{k + 1} 来处理每次删除的不一定是所有 00 入度点的问题。放到这个问题上同理,我们考虑设 gSg_S 表示将 SS 划分成若干个 00 入度 SCC 的带权求和,系数为 (1)k+1(-1)^{k + 1}
考虑如何计算 gSg_S,我采用的方法或许和其他题解中略有区别。我们考虑对于 SS,建立其所有导出子图和关于 gg 的带权求和的双射。可以考虑如下等式:
22eS=TS,T22eST+E(ST,T)gT2^{2e_{S}} = \sum\limits_{T \subseteq S, T\neq \emptyset}2^{2e_{S - T} + E(S - T, T)}g_T
其中 E(S,T)E(S, T) 表示两端分别在 S,TS, T 中的无向边数量(两个方向只算一次),eSe_S 表示 SS 内部的无向边数量。E(S,T)E(S, T) 可以用 eSTeSeTe_{S \cup T} - e_{S} - e_{T} 计算。
这个等式成立的原因:两边都代表 SS 的导出子图数量,右边相当于钦定 TT 中均为 00 入度 SCC,剩下的边乱连。
那么移项之后,只需计算所有 gT(TS)g_T(T\subset S) 即可推出 gSg_S。初始化有 g=1g_{\emptyset} = -1,这部分时间复杂度为 O(3n)\mathcal O(3 ^ n)
接下来计算 fSf_S。我们可以考虑用 g,fg, f 之间的递推式解决:
gS=TS,lowbit(S)TfTgSTg_{S} = \sum\limits_{T \subseteq S, \mathrm{lowbit}(S) \in T}-f_{T}g_{S - T}
gg 的意义就是划分成若干个 SCC,互相不连边)
同理移项后可以表示出 fSf_{S},时间复杂度也是 O(3n)\mathcal O(3 ^ n)
最后考虑如何计算答案。“恰好”的条件不好处理。考虑先做一步容斥:枚举 TST\supseteq S,钦定 TT 中的点组成了若干个合法 SCC。设 TST - S 中的点组成了 kk 个 SCC,那么相当于违反了 kk 个限制,容斥系数为 (1)k(-1) ^ k。观察到这个系数就是 gTS-g_{T - S}
对于剩下的边,我们还有:
  • TT 可以向 UTU - T 连边;
  • UTU - T 内部可以任意连边。
因此 TThSh_S 的贡献即为 fSgTS22eUT+E(UT,T)-f_{S}g_{T - S}2^{2e_{U - T} + E(U - T, T)}
至此 C 性质被解决。时间复杂度 O(3n)\mathcal O(3 ^ n)代码

接下来考虑正解,这里才正式开始和最小生成树的条件对决。
考虑 Kruskal 的过程,我们从小到大合并连通块。显然无论生成树取了什么,在合并完所有 w\le w 的边之后得到的连通性应当是相同的。同理,放到有向图上,弱连通性也得是相同的。
那么我们可以这样判断一张图是否合法:
从小到大扫描 ww维护目前每个联通块可能成为根的点集(下面称为根集)。加入所有权值为 ww 的边时,尽可能合并所有的连通块,并更新根集。最后根集非空即为合法。
下面称连通块为大点,我们考虑大点之间的图。
考虑根集应当如何合并:我们称一条边是关键边,当且仅当其终点属于根集。那么显然只需要保留所有关键边,这些关键边应当存在大点之间的一棵外向生成树。那么新的根集就是可能成为大点外向树的根对应的大点的根集之并。
可能说起来比较绕。实际上就是找到所有可能成为大图中的树根的点,这些点对应的原连通块,找到这些连通块中可能是根的点,并起来就是新的根。
发现这实际上形如若干个 C 性质的问题并起来。因此类似考虑容斥,大体过程类似,区别在于:
  • gg 在计算的时候,“不连边”的条件相当于没有关键边,因此需要考虑终点是非根节点的边;
  • gfg\to f 在递推的时候,还需要考虑 STS - TTT 之间的非关键边;
  • 算答案的时候,要考虑 SSTST - S 间的非关键边,以及 UTU - TTT 连的非关键边。
注意还有可能有无效的边(无论如何都不会在生成树里),给答案全局 ×4\times 4 即可。
时间复杂度还是 O(3n)\mathcal O(3 ^ n)(参考其他题解证明),注意实现细节。代码

评论

1 条评论,欢迎与作者交流。

正在加载评论...