题目大意:求有向图中这种图的数量
从分层图来考虑,这是一个层数为3的图
枚举第一个点能到达的所有点,对他们进行BFS求第三层的点(假装它是BFS其实直接枚举效果一样)
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #define ll long long 6 #define M 100010 7 using namespace std; 8 struct point{ 9 int to,next; 10 }e[M<<1]; 11 int n,m,num; 12 int head[M],vis[M]; 13 ll ans; 14 void add(int from,int to) 15 { 16 e[++num].next=head[from]; 17 e[num].to=to; 18 head[from]=num; 19 } 20 void bfs(int x) 21 { 22 memset(vis,0,sizeof(vis)); 23 queue<int>q; 24 for(int i=head[x];i;i=e[i].next) q.push(e[i].to); 25 while(!q.empty()) 26 { 27 int p=q.front(); q.pop(); 28 for(int i=head[p];i;i=e[i].next) 29 { 30 int to=e[i].to; 31 if(to!=x) vis[to]++; 32 } 33 } 34 for(int i=1;i<=n;i++) ans+=(ll)(vis[i]-1)*vis[i]/2; 35 } 36 int main() 37 { 38 scanf("%d%d",&n,&m); 39 for(int i=1;i<=m;i++) 40 { 41 int x,y; scanf("%d%d",&x,&y); 42 add(x,y); 43 } 44 for(int i=1;i<=n;i++) bfs(i); 45 printf("%lld",ans); 46 return 0; 47 }