PAT甲级 1076(C++ 可以用DFS)

测试点一、四一直过不去,想了挺久,终于对了

设一个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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45681165/article/details/121090129