首先我们知道一般图的三元环个数是(msqrt m)级别的,而下面的算法将达到该理论最低复杂度。
下文默认(n)为点数,(m)为边数,(S_u)为(u)的出点集,(d_u)为(d)的出度,(g_u)为(u)的入度。
无向图三元环计数
首先我们给边重定向,由度数大的向度数小的,度数相等的按点的编号就行。
然后我们枚举一个点(u),遍历(vin S_u),再遍历(win S_v),如果(win S_u),那么我们就找到了一个三元环((u,v,w))。
可以证明其复杂度为(O(msqrt m))。并且在这个算法的过程中我们是找到了每一个三元环的。
有向图三元环计数
首先我们把边都看作是无向边,然后按照上面的算法跑一遍。
但是按照上面的算法找出来的((u,v,w))并不一定满足((u,v),(v,w),(w,u))都在这个有向图中。
所以我们在枚举到某个三元环的时候判断一下是否存在这三条边就行了。
竞赛图/弦图找三元环
我们知道一个竞赛图如果存在一个环,那么它一定存在一个三元环。
所以直接dfs就行了。
竞赛图三元环计数
和上面完全没有关系的另一个算法。
考虑补集容斥,总共有(nchoose3)个三元组。
枚举一个点(u),(forall v,win S_u,(u,v,w))不能构成三元环。
而且显然这样的三元组只会在(u)被枚举到一次。
所以总的三元环个数为({nchoose3}-sumlimits_{i=1}^n{d_ichoose2})。
竞赛图三元环期望
就是(n)个点的竞赛图给定了(m)条边的方向,剩下的方向都不确定,求期望三元环个数。
这里我们先计算出确定的出度以及入度。然后记(l_i)表示(n-1-d_i-g_i)即某个点连出去的未确定方向的边数。
答案为({nchoose3}-sumlimits_{i=1}^n({d_ichoose2}+frac{d_il_i}2+frac{l_ichoose2}4))