三元环计数

一个非常简单的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.

posted @ 2024-08-10 14:21  ~Cyan~  阅读(0)  评论(0编辑  收藏  举报