三元环计数
一个非常简单的trick,之前一直没有去了解。
对于一个无向图的三元环个数,很容易能想到一个 \(O(\sum_{(u_i,v_i) \in E}du_{v_i} + m)\) 的做法。
我们考虑将每条边 \((u,v)\) 按照某种方法给每条边定向,使得三元环当且仅当 \((u \to v),(v \to k),(u \to k)\)。然后发现当我们让边 \((u,v)\) 按度数从低向高连边,能得到一个有向无环图,而此时的复杂度就是 \(O(\sum_{(u_i,v_i) \in E} out_{v_i} + m )\) 的,而此时就是 \(O(m \sqrt m)\) 的。
以下是证明:
-
当 \(out_v\) 小于 \(\sqrt m\),最高复杂度也就是 \(O(m \sqrt m)\)。
-
当 \(out_v\) 大于 \(\sqrt m\),由于按照度数从低向高连边,所以之多有 \(O(\sqrt m)\) 个点,一样是 \(O(m \sqrt m)\)。
Q.E.D.