传送门
1.bfs
2.维护广搜层数
#include<bits/stdc++.h>
using namespace std;
vector<vector<int > > data;
int n,k;
int cnt = 0;
vector<bool > vis;
struct node{
int id;
int step;};
//要广度优先搜索,因为若某个节点在step更大的情况下被标记,可能会导致最后结果变小
//void dfs(int id,int step)
//{
//
// if(step > k) return;
// // for(int i=0;i<data[id].size();i++){
// if(vis[data[id][i]]==false){
// cnt++;
// vis[data[id][i]] = true;
// // p.push_back(data[id][i]);
// dfs(data[id][i],step+1);
// }
// }
//}
void bfs(int id){ node f = {id,0};
vis[id] = true;
queue<node > q;
q.push(f);
while(!q.empty()){
node tp = q.front();
q.pop();
for(int i=0;i<data[tp.id].size();i++){
if(vis[data[tp.id][i]]==false&&tp.step<k){
vis[data[tp.id][i]] = true;
cnt++;
node next = {data[tp.id][i],tp.step+1};
q.push(next);
}
}
}
}
int main()
{
scanf("%d%d",&n,&k);
data.resize(n+1);
vis.resize(n+1);
for(int i=1;i<=n;i++){
int num;
scanf("%d",&num);
int tp;
for(int j=0;j<num;j++){
scanf("%d",&tp);
data[tp].push_back(i);
}
}
int t;
scanf("%d",&t);
for(int i=0;i<t;i++){
int id;
scanf("%d",&id);
fill(vis.begin(),vis.end(),false);
cnt = 0;
bfs(id);
printf("%d\n",cnt);
}
return 0;
}