思路
- 有bfs进行遍历,并用layer[]储存和查询点的层次即可。
注意
- 别用dfs,因为有两个问题,第一个是求出一个长度的路径,有可能有更短的路径。第二个是最短路径被以及访问过的节点阻挡住了。
代码
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,l;
const int maxn=1010;
vector<int> adj[maxn];
bool vis[maxn]={false};
int ans;
int layer[maxn];
void initial(){
for(int i=1;i<=n;i++) vis[i]=false;
}
void BFS(int u){
queue<int> q;
q.push(u);
vis[u]=true;
layer[u]=0;
while(q.size()){
int temp=q.front();
q.pop();
for(int i=0;i<adj[temp].size();i++){
int v=adj[temp][i];
if(vis[v]==false){
vis[v]=true;
q.push(v);
layer[v]=layer[temp]+1;
if(layer[v]<=l) ans++;
}
}
}
}
int main(){
scanf("%d%d",&n,&l);
int a,b;
for(int i=1;i<=n;i++){
scanf("%d",&a);
for(int j=0;j<a;j++){
scanf("%d",&b);
adj[b].push_back(i);
}
}
int query;
scanf("%d",&query);
for(int i=0;i<query;i++){
ans=0;
initial();
scanf("%d",&a);
BFS(a);
printf("%d\n",ans);
}
return 0;
}