About
其实这篇 blog 是因为自己每天一篇 blog 的 flag 要翻了才写的
三元环计数问题,即给你一张有 (n) 个点和 (m) 条边的无向图,求满足存在边 ((x,y)) ((y,z)) ((x,z)) 的无序对 ((x,y,z)) 的这样的集合的数目,或者统计这些集合的信息。
首先考虑求出每个点的度数。
然后对于两个端点度数不相同的边,由度数大的点指向度数小的点;对于两个端点度数相同的边,由标号大的点指向标号小的点。
枚举三元环的时候,首先枚举第一个点 x,同时记一个 vis[i] 表示 (i) 是否和 (x) 连边了,再枚举 (x) 的出边得到点 (y) , 再枚举 (y) 的出边并 (check) 即可,复杂度不超过 (Theta(msqrt m))
复杂度证明:
对于指向度数小于 (sqrt m) 的点的边,暴力枚举的复杂度是正确的,即 (Theta(msqrt m))
对于指向度数大于 (sqrt m) 的点的边,对每个点算他会被当做 (y) 枚举的次数,这个次数显然不会超过 (Theta(sqrt m)) 次,所以这部分的复杂度也是 (Theta(m sqrt m)) .
所以总复杂度就是 (Theta(m sqrt m))
例题 :
反演后复杂度瓶颈相当于一个三元环计数。