//该题以邻接表为数据结构,那么每个顶点与哪些顶点相邻接,在数据输入时已经决定
//后续遍历时,直接对邻接表的每一项进行大小遍历即可
//在本题中,由输入决定遍历的起始结点和最大遍历层数
//在遍历时,用BFS策略,每个结点设计一个node,存储了索引号和层数
//输出是从某个结点开始所经过的所有结点数,对应微博转发数(不包括起始结点)
#include<queue>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<vector>
#include<cstring>
//memset在cstring头函数中
using namespace std;
const int maxn = 1010;
struct node{
int id;
int layer;
};
vector<int> adj[maxn];
bool vis[maxn] = {false};
int total_person;
int max_level;
void BFS(int start, int max_level){
int forwardnum = 0;
node starts;
starts.id = start;
starts.layer = 0;
queue<node> q;
vis[start] = true;
q.push(starts);
while(!q.empty()){
node now = q.front();
q.pop();
for(int i=0;i<adj[now.id].size();i++){
node here;
here.id = adj[now.id][i];
here.layer = now.layer + 1;
if(vis[here.id]==false && here.layer<=max_level){
q.push(here);
vis[here.id] = true;
forwardnum++;
}
}
}
printf("%d\n", forwardnum);
}
int main(){
scanf("%d%d", &total_person, &max_level);
for(int i=1;i<=total_person;i++){
int follownum;
scanf("%d", &follownum);
for(int j=0;j<follownum;j++){
int id;
scanf("%d", &id);
adj[id].push_back(i);
}
}
//这里是之前存在的逻辑问题的解决
//输入格式是,用户i关注的人数,[这些人的id]
//但在转发问题上,有向边应该由被关注者指向关注者,才符合实际
//所以在push_back时,是将当前用户的id push_back到其每一个关注者对应id的vector中
int querynum;
scanf("%d", &querynum);
for(int i=0;i<querynum;i++){
int query;
scanf("%d", &query);
memset(vis, false, sizeof(vis));
BFS(query, max_level);
}
return 0;
}