Thanks to i207M && iki9 ! 三元环计数 无向图的三元环计数 我们首先需要对无向边按一定规则定向: 设 \(in[u]\) 表示 \(u\) 的度数 若 \(in[u]>in[v]\) ,从 \(u\) 向 \(v\) 连边,反之则从 \(v\) 向 \(u\) 连边。 若 \(in[u]==in[v]\) ,我们从编号大的点向编号小的点连边。 此时这张图是一张有向无环图。 枚举每个点 \(u\) ,标记所有 \(u\) 的出点;然后枚举点 \(u\) 的出点 \(v\) ,再枚举 \(v\) 的出点 \(w\) ,若 \(w\) 被标记,则 \((u,v,w)\) 成三元环。 每个三元环只会在 \(u\) 被统计一次,如下图。 代码: #define R register int inline void main() { n=g(),m=g(); for(R i=1,u,v;i<=m;++i) u=g(),v=g(),++d[u],++d[v],e[i]=edge(u,v); for(R i=1,u,v;i<=m;++i) { u=e[i].u,v=e[i].v; if(d[u]>d[v]||(d[u]==d[v]&&u>v) add(u,v); else add(v,u); } R ans=0; for(R u=1;u<=n;++u) { ++C; for