BFS遍历+记录layer,比较简单...
#include <iostream>
#include <stdio.h>
#include <queue>
#define maxn 1010
using namespace std;
int MAP[maxn][maxn] = {0};
bool visited[maxn];
int n,l,k;
void initVisited(){
for(int i=1;i<=n;i++)
visited[i] = false;
}
struct Node{
int num;
int layer;
Node(){
}
Node(int n,int l){
num = n;
layer = l;
}
};
void TravelBFS(int root,int &num){
queue<Node> q;
visited[root] = true;
int layer = 0;
q.push(Node(root,layer));
while(!q.empty()){
Node node = q.front();
q.pop();
for(int i=1;i<=n;i++){
if(MAP[node.num][i]!=0 && visited[i]==false){
visited[i] = true;
num++;
q.push(Node(i,node.layer+1));
}
}
if(q.front().layer == l){
break;
}
}
}
int main()
{
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++){
int s;
scanf("%d",&s);
for(int j=0;j<s;j++){
int v;
scanf("%d",&v);
MAP[v][i] = 1;
}
}
scanf("%d",&k);
for(int i=0;i<k;i++){
int num,root;
scanf("%d",&root);
num = 0;
initVisited();
TravelBFS(root,num);
printf("%d\n",num);
}
return 0;
}