四元环计数
给每个点按照度数大小编不同的号。
枚举点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