description:
给出(N)个点(M)条边的无向图,求其中三元环的个数
data range:
(N,Mle 10^5)
solution:
对于每条无向边,我们进行定向,由度数大的点连向度数小的点
记(S_u)表示定向后(u)可以直接到达的点的集合
首先对于所有(vin S_u)打上标记
而后枚举(vin S_u),再枚举(win S_v),如果(win S_u),那么就枚举到一个三元环
可以发现每个三元环只会被枚举到一次
可以证明其复杂度为(O(nsqrt n)),证明如下:
复杂度来源于两个部分:每个点的出边和每个点出边到达的点的出边
对于第一部分,显然复杂度为(O(n+m))
对于第二部分,
如果当前点的出度小于(sqrt m),至多有(n)个点连向它,因此复杂度为(O(nsqrt m))
如果当前点的出度大于(sqrt m)(至多为(m)),指向它的点至多只有(frac{m}{sqrt m}=sqrt m),因此复杂度为(O(msqrt m))
由于(n,m)同阶,因此总复杂度为(O(nsqrt n))