题目
思路
使用标准BFS遍历即可,使用tail记录层数,每次遍历到队列的尾巴的时候将tail更新为更新队列的尾巴
坑点
不能使用DFS,因为那样会导致问题,比如说深度为3的时候,深度遍历到第3层的时候包括了第一层未遍历的结点,这样回溯到第一层的时候那些结点就已经访问过了无法向下访问了。简单来说第二层的结点明明可以通过第一层结点知道信息,却通过了第三层的结点知道了信息,自己成了第四层,无法向下传递
代码
#include <iostream>
#include <string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define nmax 1005
#define inf 999999
#define pmax 6
vector<vector<int>> graph;
int n,L;
int visited[nmax];
int sum = 0;
void BFS(int src)
{
int depth = 0;
visited[src] = 1;
queue<int> q;
q.push(src);
int tail = src;
while (!q.empty()) {
int tmp = q.front();
q.pop();
for (auto& p : graph[tmp]) {
if (visited[p] == 0) {
visited[p] = 1;
sum++;
q.push(p);
}
}
if (tmp == tail) {
depth++;
tail = q.back();
}
if (depth == L)
break;
}
}
int main()
{
cin >> n >> L;
graph.resize(n + 1);
for (int i = 1; i <= n; ++i) {
int num;
cin >> num;
for (int j = 0; j < num; ++j) {
int tmp;
cin >> tmp;
graph[tmp].emplace_back(i);
}
}
int qnum;
cin >> qnum;
for (int i = 0; i < qnum; ++i) {
int tmp;
cin >> tmp;
sum = 0;
memset(visited, 0, sizeof(visited));
BFS(tmp);
cout << sum<< endl;
}
return 0;
}