四元环计数

给每个点按照度数大小编不同的号。

枚举点u,枚举和点u相邻的点v,枚举v的相邻且度数比uv大的点z,\(ans+=cnt[z], ++cnt[z]\);

复杂度: 枚举uv的复杂度是 \(O(n+m)\) 的,然后点z的数量不超过 \(O(\sqrt{m})\) 个。

原因: 设与x相邻的度数大于x的点y有s个,则x的度数至少为s,所以总边数\(s^2=2m\)

代码

signed main()
{
    in(n,m);
    for(ri i=1,a,b; i<=m; ++i)
    {
        in(a,b);
        E[a].pb(b),E[b].pb(a);
    }
    for(ri i=1; i<=n; ++i) du[id[i]=i]=Size(E[i]);
    sort(id+1,id+1+n,cmp);
    for(ri i=1; i<=n; ++i) rk[id[i]]=i;
    for(ri u=1; u<=n; ++u)
        for(solid v:E[u])
            if(rk[v]>rk[u]) G[u].pb(v);
    LL ans=0;
    for(ri u=1; u<=n; ++u)
    {
        for(solid v:E[u])
            for(solid w:G[v])
                if(rk[w]>rk[u]) ans+=cnt[w]++;
        for(solid v:E[u])
            for(solid w:G[v])
                if(rk[w]>rk[u]) cnt[w]=0;
    }
    out(ans);
    return 0;
}

原文:https://www.luogu.com.cn/blog/i207M/san-yuan-huan-ji-shuo-xue-xi-bi-ji

posted @ 2022-09-07 12:00  kingwzun  阅读(74)  评论(0编辑  收藏  举报