【题解】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;
}
posted @ 2026-01-13 11:42  Ming3398  阅读(8)  评论(0)    收藏  举报