【题解】hdu6184
一:【题意】
求一张图有多少四元组 \((A,B,C,D)\) 满足存在边 \((AB,BC,CD,DA,AC)\)
二:【解法】
统计每条边在几个三元环内
对于一条边,设它在 \(x\) 个三元环内,那么它对答案的贡献为 \(x \times (x-1)/2\)
三:【代码】
#include<bits/stdc++.h>
#define Pair pair<int,int>
#define v first
#define id second
using namespace std;
typedef long long LL;
const int N=3e5+10,M=6e5+10;
struct Edge{
int u,v;
}edg[M];
vector<Pair> mp[N];
int deg[N];
int as[M];
int vis[N];
int main(){
//freopen("in.txt","r",stdin);
int n,m;
while(cin>>n>>m){
for(int i=1;i<=n;i++){
mp[i].clear();
deg[i]=0;
}
for(int i=1;i<=m;i++){
as[i]=0;
}
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
edg[i]={u,v};
deg[u]++;deg[v]++;
}
for(int i=1;i<=m;i++){
int u=edg[i].u,v=edg[i].v;
if(deg[u]>deg[v]||(deg[u]==deg[v]&u>v)) swap(u,v);
mp[u].push_back({v,i});
}
for(int u=1;u<=n;u++){
for(auto e:mp[u]){
int v=e.v,id=e.id;
vis[v]=id;
}
for(auto e1:mp[u]){
int v=e1.v,id1=e1.id;
for(auto e2:mp[v]){
int w=e2.v,id2=e2.id;
if(!vis[w]) continue;
int id3=vis[w];
as[id1]++;as[id2]++;as[id3]++;
}
}
for(auto e:mp[u]){
int v=e.v,id=e.id;
vis[v]=0;
}
}
LL ans=0;
for(int i=1;i<=m;i++){
//cout<<as[i]<<" ";
ans+=1LL*as[i]*(as[i]-1)/2;
}
cout<<ans<<"\n";
}
return 0;
}

浙公网安备 33010602011771号