三元环计数
求出无向图三元环和四元环的个数
做法
将图中的所有边按照度数由大向小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v 并标记,再枚举 v 的出边到的点 w,如果也有标记则表示找到了一个三元环,时间复杂度为 (Theta(msqrt m)),很容易证明一个三元环只会被枚举一次
时间复杂度证明
网上有好多证明都是错的,搞了半天才搞懂
以下分析不带常数,比如用 (sqrt m) 代替 (sqrt {2m})
考虑每个点对答案的贡献,即有若干条入边枚举到它,然后再枚举它的所有出边,也就是 (in_x*out_x),由于是度数从大向小连的边,所以 (in_x le sqrt m),为什么呢,考虑如果 (in_x > sqrt m),那么它有至少 (sqrt m) 条边,而连向它的点的度数都大于它的度数,而最多只可能有 (sqrt m) 个度数大于 (sqrt m) 的点,所以矛盾。因此总时间复杂度是 (Theta(sqrt m*m)=Theta(msqrt m)) 的
同理如果从度数小的连向度数大的,那么 (out_x le sqrt m),读者可自证
四元环计数
做法
与三元环有些区别在于这里既要用到定向后的有向边,也要用到没有定向的无向边
下文无向边指原图中的边,出边和入边指有向图的边
将图中所有的边按度数由大到小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v ,然后枚举 v 的无向边到的点 w,其中要求 w 的度数要小于 u,时间复杂度仍然为 (Theta(msqrt m)),每个四元环只会在其最小度数点的位置被统计一次
时间复杂度证明
仍然考虑一个点对复杂度的贡献,首先它被 (in_x) 条边枚举到,然后遍历它所有的 (deg_x) 条无向边,也就是 (in_x * deg_x),同三元环的证明,(in_x) 不会超过 (sqrt m),复杂度得证
那么从小向大连当然也是可以的,但 u 要先枚举无向边,然后再枚举有向边即可