三元环

三元环

  • 问题描述,给定无向图,然后求出三元环个数

  • 建图做法:先把无向图转化为 \(DAG\) ,把边去重,然后把度数从小的点连向度数大的点。

  • 显然的是,每个三元环只能被找到一次。

  • 时间复杂度证明:

可知边 \((x, y)\) 被遍历的次数是 \(out_y\),所以总复杂度是 \(m\times out_i\)
然后假设所有点 \(out_i< \sqrt m\),那么上界就是 \(m \times \sqrt m\)
假设有点度数存在 \(out_i> \sqrt m\),因为是度数低的连向度数高的,所以至少有 \(\sqrt m\) 点连向 \(i\),并且度数也是 \(\sqrt m\),所以,其实度数最大只能是小于 \(\sqrt m\),不能大于 \(\sqrt m\)
所以总的时间复杂度是 \(O(m \sqrt m)\) 的。

  • 找环
for (int i = 1; i <= n; i ++) {
    for (auto v:G[i]) vis[v] = i;
    for (auto v:G[i]) {
        for (auto vv : G[v]) {
            if (vis[vv] == i)x++;
        }
    }
}
posted @ 2021-05-31 11:24  u_yan  阅读(224)  评论(0编辑  收藏  举报