题意是有n个小岛,并且,给你k个牛,m条路,但是这些路是单向的,然后把某个牛放到某个岛上,然后这k头牛想要在岛上聚会,然后你要找到所有牛都能到的岛上去,输出一共有几个这样的岛;
第一点,如果这个岛k头牛都能到,那么这个岛就是我们要找的聚集地,
第二点,路是单向的,我们需要单向存图
分析:把题目简化一下就是看拿到一块地,这M头牛能不能到达这里。就是一个DFS,对于每一头牛找出这头牛所能达到
的地的标号,那么这块地的sum数组++。然后对于每一块地判断一下当前地所能到达的牛的头数,如果数量等于牛的总
数量,那么这块地就可以被选作聚会用地
参见大佬的代码(原出处):https://blog.csdn.net/acm_zl/article/details/10468031
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int map[1005][1005];
int cow[105];
int vis[1005];
int sum[1005];//sum标记岛,有几个牛能到达
int k,n,m;//n是几个岛//m是几条路
void dfs(int x){
vis[x]=1;
sum[x]++;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&map[x][i]){
dfs(i);
}
}
}
int main(){
int a,b;
scanf("%d%d%d",&k,&n,&m);
for(int i=1;i<=k;i++)
{
scanf("%d",&cow[i]);
}
memset(map,0,sizeof(map));
memset(sum,0,sizeof(sum));
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=1;
}
for(int i=1;i<=k;i++)
{
memset(vis,0,sizeof(vis));
dfs(cow[i]);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(sum[i]==k)
ans++;
}
printf("%d",ans);
return 0;
}