题意:
给出一张图,问有多少个这样的结构
枚举a和c,然后如果有x个点既与a的出边相连又与c的入边相连,那么答案累加C(x,2)
一开始还想用bitset判断,n^3/64 应该会T
边数是点数的10倍,均摊一个点10条边,所以直接枚举判断即可
#include<bits/stdc++.h> using namespace std; #define N 3001 vector<int>out[N],in[N]; int li[N],lo[N]; bool vis[N]; int main() { int n,m,u,v; scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&u,&v); out[u].push_back(v); in[v].push_back(u); } for(int i=1;i<=n;++i) { li[i]=in[i].size(); lo[i]=out[i].size(); } long long ans=0; int sum; for(int i=1;i<=n;++i) { for(int k=0;k<lo[i];++k) vis[out[i][k]]=true; for(int j=1;j<=n;++j) { if(i==j) continue; sum=0; for(int k=0;k<li[j];++k) if(vis[in[j][k]]) ++sum; ans+=1ll*sum*(sum-1)/2; } for(int k=0;k<lo[i];++k) vis[out[i][k]]=false; } printf("%lld",ans); }