无向图三元环计数

无向图的三元环的定义

无向图 G 的三元环指的是一个 G 的一个子图 G0,满足 G0 有且仅有三个点 u,v,w,有且仅有三条边 u,v,v,w,w,u。两个三元环 G1,G2 不同当且仅当存在一个点 u,满足 uG1uG2

P1989 无向图三元环计数

题目描述
给定一个 n 个点 m 条边的简单无向图,求其三元环个数。

考虑转换成有向图,度数小的点连向度数大的点,度数一样则从编号小连到编号大的点,然后再找三元环
时间复杂度O(mm)

#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;
}

参考 https://www.luogu.com.cn/blog/fusu2333/solution-p1989

posted @   Bertidurlah  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示