P1989 无向图三元环计数(三元环)
题目来源:https://www.luogu.com.cn/problem/P1989
//
题意:给你一个图,问图中有多少个三元环(板子题)
//
思路:每个u点的出边点v打上u标记,然后枚举v点,如果v点的出点w被标记了u,那么该(u,v,w)就是一个三元环
//
代码细节:出度多的指向少的,否则编号小的指向编号大的
//
题解:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+9;
struct Nod{
int u,v;
}e[N];
int deg[N],vis[N],ans=0;
vector<int>g[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v;
++deg[e[i].u],++deg[e[i].v];
}
for(int i=1;i<=m;i++){//出度多的指向少的,否则编号小的指向编号大的
int u=e[i].u,v=e[i].v;
if(deg[u]<deg[v] || (deg[u]==deg[v]&&u>v)){swap(u,v);}
g[u].push_back(v);
}
for(int u=1;u<=n;u++){
for(auto v:g[u]){vis[v]=u;}//每个u点的出边点v打上u标记,然后枚举v点,如果v点的出点w被标记了u,那么该(u,v,w)就是一个三元环
for(auto v:g[u]){
for(auto w:g[v]){
if(vis[w]==u){ans++;}
}
}
}
cout<<ans<<endl;
return 0;
}
浙公网安备 33010602011771号