题目大意:求有向图中这种图的数量
从分层图来考虑,这是一个层数为3的图
枚举第一个点能到达的所有点,对他们进行BFS求第三层的点(假装它是BFS其实直接枚举效果一样)
代码:
1 #include2 #include 3 #include 4 #include 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 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 }