版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84347455
因为level在1到L层内的都需要计数,所以用bfs,一开始用dfs,发现有些远的点被提前遍历到了,导致有更短的路径时会忽略这个节点,导致答案错误,而bfs每次都是先遍历距离最短的点,所以这个错误就不会出现了。
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=1e3+5;
struct Node
{
int u,dis;
};
int n,l,now,vis[N];
vector<int> G[N];
int bfs(int s)
{
queue<Node> q;
q.push({s,0});
vis[s]=now;
int cnt=0;
while(!q.empty())
{
Node u=q.front();
q.pop();
if(u.dis>=1) cnt++;
for(int i=0;i<G[u.u].size();i++)
{
int v=G[u.u][i];
if(vis[v]==now) continue;
vis[v]=now;
if(u.dis+1<=l) q.push({v,u.dis+1});
}
}
return cnt;
}
int main()
{
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++)
{
int m;scanf("%d",&m);
while(m--)
{
int x;scanf("%d",&x);
G[x].push_back(i);
}
}
int q;scanf("%d",&q);
now=0;
while(q--)
{
now++;
int x;scanf("%d",&x);
printf("%d\n",bfs(x));
}
return 0;
}