环计数
参考资料
简介
三元环计数(Triangle Counting)要求统计无向简单图中所有满足三点两两相邻的无序三元组 的数量。
算法基于边定向:将每条无向边 定向为从度数较小的端点指向度数较大的端点(度数相同则从编号较小指向较大)。定向后图为 DAG。枚举每个节点 ,标记 指向的所有节点,再枚举 的出边邻居 的出边邻居 ,若 被标记则 构成三元环。时间复杂度 。
实现
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int deg[N];
bool vis[N];
vector<int> G[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
vector<pair<int,int>> edges(m);
for(auto &[u,v]:edges)
{
cin>>u>>v;
deg[u]++;deg[v]++;
}
for(auto [u,v]:edges)
{
if(deg[u]<deg[v]||(deg[u]==deg[v]&&u<v))G[u].push_back(v);
else G[v].push_back(u);
}
int ans=0;
for(int u=1;u<=n;u++)
{
for(auto v:G[u])vis[v]=1;
for(auto v:G[u])
{
for(auto w:G[v])
{
if(vis[w])ans++;
}
}
for(auto v:G[u])vis[v]=0;
}
cout<<ans<<'\n';
return 0;
}