1 // D题 判平行四边形的个数 忘记了数学方法 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #include<deque> 11 #include<map> 12 #include<iostream> 13 using namespace std; 14 typedef long long LL; 15 const double pi=acos(-1.0); 16 const double e=exp(1); 17 //const int MAXN =2e5+10; 18 const int N =332748118; 19 20 struct edge 21 { 22 int to; 23 int next; 24 }edge[30009]; 25 int head[30009]; 26 int vis[3009]; 27 int check[3009]; 28 29 int main() 30 { 31 int i,p,j,n,t; 32 int m,cnt,a,b,x; 33 scanf("%d%d",&n,&m); 34 35 memset(head,-1,sizeof(head)); 36 cnt = 0; 37 while(m--) 38 { 39 scanf("%d%d",&a,&b); 40 edge[cnt].to = b; 41 edge[cnt].next = head[a]; 42 head[a] = cnt++; 43 } 44 45 ans = 0; 46 for(i = 1; i <= n; i++) 47 { 48 memset(vis,0,sizeof(vis)); 49 for(j = head[i]; j != -1; j = edge[j].next) 50 { 51 x = edge[j].to; 52 for(p = head[x]; p != -1; p = edge[p].next) 53 { 54 if(edge[p].to != i) 55 { 56 vis[edge[p].to] ++; 57 } 58 } 59 } 60 61 for(j = 1; j <= n; j++) 62 { 63 if(i != j) 64 { 65 ans += vis[j] * (vis[j] - 1) / 2; 66 } 67 } 68 69 } 70 71 72 printf("%d ", ans); 73 return 0; 74 }