测试点一、四一直过不去,想了挺久,终于对了
设一个flag数组,用于存放dfs访问这个结点时,所处的层数。如果再次访问到这个结点,层数<flag数组中存放的值,说明可以遍历到之前没遍历到的后续结点;如果层数>=flag数组中存放的值,说明遍历不到后续未被遍历过的结点,直接跳过。
#include<iostream>
#include<unordered_set>
#include<vector>
using namespace std;
vector<vector<int>>info;
vector<int>flag;
int N, L;
int times;
unordered_set<int>temp;
void dps(int start,int q) {
if (times == L) return;
times++;
for (int i = 0; i < info[start].size(); i++){
if (info[start][i] != q && flag[info[start][i]]>times) {
temp.insert(info[start][i]);
flag[info[start][i]] = times;
dps(info[start][i],q);
}
}
times--;
}
int main() {
cin >> N >> L;
info.resize(N + 1);
flag.resize(N + 1);
for (int i = 1; i <= N; i++) {
int num; cin >> num;
for (int j = 1; j <= num; j++) {
int up; cin >> up;
info[up].push_back(i);
}
}
int q_num; cin >> q_num;
for (int i = 1; i <= q_num; i++) {
int q; cin >> q;
times = 0; temp.clear();
fill(flag.begin(), flag.begin() + N + 1, L+1);
dps(q,q);
cout << temp.size() << endl;
}
return 0;
}