hdu6184(三元环)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=6184

题意

统计子图 $G={(A,B,C,D),(AB,BC,CD,DA,AC)}$ 的个数

题解

这就是两个有公共边的三元环,那么只要对公共边统计贡献就可以了,如果公共边被 $t$ 个三元环包含,那么其产生的贡献为 $\frac{t(t-1)}{2}​$ ,所以在统计三元环的时候直接对边权进行标记即可




代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
*         ┏┓    ┏┓
*         ┏┛┗━━━━━━━┛┗━━━┓
*         ┃       ┃  
*         ┃   ━    ┃
*         ┃ >   < ┃
*         ┃       ┃
*         ┃... ⌒ ...  ┃
*         ┃ ┃
*         ┗━┓ ┏━┛
*          ┃ ┃ Code is far away from bug with the animal protecting          
*          ┃ ┃ 神兽保佑,代码无bug
*          ┃ ┃           
*          ┃ ┃       
*          ┃ ┃
*          ┃ ┃           
*          ┃ ┗━━━┓
*          ┃ ┣┓
*          ┃ ┏┛
*          ┗┓┓┏━━━━━━━━┳┓┏┛
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛
*/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<set>
#include<bitset>
#include<assert.h>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define eps 1e-6
#define succ(x) (1<<x)
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define mid (x+y)/2
#define NM 100005
#define nm 200005
#define pi 3.1415926535897931
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}





struct edge{int x,t;edge*next;}e[nm],*h[NM];
int n,m,b[NM],v[NM],ans[nm],_v[NM];
ll s;


int main(){
while(~scanf("%d%d",&n,&m)){
inc(i,1,n)h[i]=0,b[i]=0,v[i]=0;s=0;
inc(i,1,m)e[i].x=read(),e[i].t=read(),b[e[i].x]++,b[e[i].t]++,ans[i]=0;
inc(i,1,m){
if(b[e[i].t]>b[e[i].x]||(b[e[i].x]==b[e[i].t]&&e[i].x>e[i].t))swap(e[i].x,e[i].t);
e[i].next=h[e[i].x];h[e[i].x]=e+i;
}
#define _link(x) for(edge *k=h[x];k;k=k->next)
inc(i,1,n){
link(i)v[j->t]=i,_v[j->t]=j-e;
link(i){
_link(j->t)if(v[k->t]==i)ans[j-e]++,ans[k-e]++,ans[_v[k->t]]++;
}
}
inc(i,1,m)s+=1ll*ans[i]*(ans[i]-1)/2;
printf("%lld\n",s);
}
return 0;
}