【技巧】三元环计数

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(m\sqrt m)\)

复杂度证明:

对于指向度数小于 \(\sqrt m\) 的点的边,暴力枚举的复杂度是正确的,即 \(\Theta(m\sqrt m)\)

对于指向度数大于 \(\sqrt m\) 的点的边,对每个点算他会被当做 \(y\) 枚举的次数,这个次数显然不会超过 \(\Theta(\sqrt m)\) 次,所以这部分的复杂度也是 \(\Theta(m \sqrt m)\) .

所以总复杂度就是 \(\Theta(m \sqrt m)\)


例题 :


SDOI2018 旧试题

反演后复杂度瓶颈相当于一个三元环计数。


posted @ 2020-10-14 21:46  srf  阅读(616)  评论(0编辑  收藏  举报