无向图三元环计数
无向图的三元环的定义
无向图
P1989 无向图三元环计数
题目描述
给定一个个点 条边的简单无向图,求其三元环个数。
考虑转换成有向图,度数小的点连向度数大的点,度数一样则从编号小连到编号大的点,然后再找三元环
时间复杂度
#include<bits/stdc++.h>
#define cs const
#define il inline
#define ri register
#define pc(i) putchar(i)
using namespace std;
il void read(int &as)
{
as=0;int f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') as=(as<<3)+(as<<1)+(ch^48),ch=getchar();as*=f;
}
void wt(int x){if(x<0) x=-x,pc('-');if(x>9) wt(x/10);pc(x%10|48);}
cs int N=2e5+7;
struct node{int to,nxt;}e[N];
int n,m,eoe,ans,h[N],r[N][2],deg[N],tag[N];
il void add(cs int u,cs int v){e[++eoe]={v,h[u]},h[u]=eoe;}
signed main()
{
read(n),read(m);
for(ri int i=1;i<=m;++i)
read(r[i][0]),read(r[i][1]),
deg[r[i][0]]++,deg[r[i][1]]++;
for(ri int i=1;i<=m;++i)
{
int Min=deg[r[i][0]]<deg[r[i][1]]?0:1;
if(deg[r[i][0]]==deg[r[i][1]]) Min=r[i][0]<r[i][1]?0:1;
add(r[i][Min],r[i][Min^1]);
}
for(ri int u=1;u<=n;++u)
{
for(ri int j=h[u];j;j=e[j].nxt) tag[e[j].to]=u;
for(ri int i=h[u];i;i=e[i].nxt)
for(ri int j=h[e[i].to];j;j=e[j].nxt)
if(tag[e[j].to]==u) ans++;
}
wt(ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】