2.14在杭二参加集训,校园好美!!!QAQ
杜教在下午为大家做了上午三题的讲解和一些CF杂题的选讲,其中有在图上求所有三元环的算法。这个算法不是很复杂,但还是蛮有趣的啦QWQ
我们已有一些整数,记作a1,a2,...,an。我们希望求出这些数中有多个含有三个元素的子集满足题目的条件,即{ai,aj,ak}中(ai,aj)=1且(ai,ak)=1且(aj,ak)=1。
第一步,建图。将a1,a2,...an分别作为编号为1,2,...,n的点处理,且如果ai和aj互质,那么结点i和结点j之间建立一条无向边。
第二步,排序。将每个节点的度数按一定顺序排序(比如,从大到小),之后根据得到的排序将无向图调整为有向图(比如,边的方向定为从度数高的结点指向度数低的)。这样操作可以避免一下的情况:i->j->k->i。出现的情况是这的:i->j->k<-i。
第三步,枚举。先确定结点i,枚举两条i出发的边,假设分别指向j,k。若j和k之间存在边,则说明i,j,k构成了三元环,即ai,aj,ak是满足题目条件的。如此枚举便可以做到不重不漏哦。
算法的时间复杂度可以分情况证明,为O((2m)^(3/2))。
时间: 2024-10-29 19:08:07