见代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=100010;
int n,l,k;
int h[N],e[M],ne[M],idx;//h[]某点第一条边的编号 ,e[M]表示边的终点的值,ne[M]同一起点下一条边的编号,idx为边的编号
bool f[N];
void add(int a,int b){//邻接表建树
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int bfs(int u){
int ans=0;
queue<int>q;
memset(f,0,sizeof(f));//必须重新赋值
q.push(u);
f[u]=1;
for(int i=0;i<l;i++){
int cnt=q.size();//记录该层的点数
while(cnt--){//依次遍历该层的每个点,将每个点可以到达且没有遍历过的点加入队列
int t=q.front();
q.pop();
//遍历每个点可以到达的点
for(int i=h[t];i!=-1;i=ne[i]){//注意是 i=ne[i]
int j=e[i];
if(!f[j]){
f[j]=1;
q.push(j);
ans++;
}
}
}
}
return ans;
}
int main(){
cin>>n>>l;
memset(h,-1,sizeof(h));
for(int i=1;i<=n;i++){
int x;
cin>>x;
while(x--){
int id;
cin>>id;
add(id,i);//偶像指向粉丝
}
}
cin>>k;
while(k--){
int x;cin>>x;
cout<<bfs(x)<<endl;
}
}