三元环和四元环
三元环
判断任意无向图是否存在三元环,或者三元环计数问题,有着极简的解法。
首先我们给无向图定向:对于度数不同一对节点,按度数定向;度数相同,按节点编号定向。其实具体怎么做都无所谓,只要能连成一个有向无环图即可。
枚举一个节点 \(u\) ,对于它的每一个后继节点 \(v\) 打一个标记,然后再遍历 \(v\) 的后继节点,如果遍历到一个打过标记的节点,也就找到了一个三元环。
这就是一个暴力做法,现在我们分析它的复杂度。对于一条从 \(u\) 到 \(v\) 的边,贡献为 \(v\) 的出度,复杂度为 $ \sum_{ e: u \to v } out_v $ 。根号分治一下,对于出度不超过 $ \sqrt M $ 的点,贡献为 $ M \sqrt M $ ;对于出度大于 $ \sqrt M $ 的点,由于连向它的点度数都不低于它,所以只会贡献 $ \sqrt M $ 次。
所以总的复杂度为 $ O( M \sqrt M ) $ 。
四元环
沿用上述对边定向的思路。
注意到四元环由两条链拼起来,如果直接按三元环做,可能有两种情况:两条链长都为2,或一条链长3,另一条链长1。
所以在枚举 \(u\) 的后继时使用原图的边可以很好地解决这个问题。
具体来说,枚举起始节点 \(u\) ,枚举 \(u\) 的后继 \(v\) (这里遍历的是原图的边),再枚举 \(v\) 的后继 \(k\) (这里遍历的是定向后的图),对每个 \(k\) 记录遍历到的次数,统计答案即可。
按照类似三元环的复杂度分析,四元环也是 $ O( M \sqrt M ) $ 的。
简直太厉害啦!
例题
P1989 无向图三元环计数 ,这就是真模板了。

浙公网安备 33010602011771号