http://www.patest.cn/contests/pat-a-practise/1076
easy
主要是用queue记录节点和它的层数
struct node{
int data;
int layer;
};
还有就是在bfs中定义queue,不然在其他地方还得考虑每次新的bfs初始化
#include <cstdio>
#include <vector>
#include <string.h>
#include <queue>
#define MAX 1010
using namespace std;
struct node{
int data;
int layer;
};
vector <int> adj[MAX];
int vis[MAX];
void init(){
for(int i=0;i<MAX;i++){
adj[i].clear();
vis[i]=0;
}
}
int bfs(int x,int l){
queue <node> q;
vis[x]=1;
node tmp;
tmp.layer=0;
tmp.data=x;
q.push(tmp);
int ans=0;
while(!q.empty()){
node fro=q.front();
q.pop();
int cur=fro.data;
int curlay=fro.layer+1;
if(curlay>l){
break;
}
for(int i=0;i<adj[cur].size();i++){
if(vis[adj[cur][i]]==0){
tmp.data=adj[cur][i];
tmp.layer=curlay;
q.push(tmp);
vis[tmp.data]=1;
ans++;
}
}
}
return ans;
}
int main(){
freopen("in.txt","r",stdin);
int n,l;
while(scanf("%d %d",&n,&l)!=EOF){
for(int i=1;i<=n;i++){
int num;
scanf("%d",&num);
for(int j=0;j<num;j++){
int x;
scanf("%d",&x);
if(x!=0){
adj[x].push_back(i);
}
}
}
int num;
scanf("%d",&num);
for(int i=0;i<num;i++){
int x;
scanf("%d",&x);
memset(vis,0,sizeof(vis));
int ans=bfs(x,l);
printf("%d\n",ans);
}
}
return 0;
}