PTA甲级考试真题练习76——1076 Forwards on Weibo

题目

在这里插入图片描述

思路

使用标准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;
}
发布了153 篇原创文章 · 获赞 4 · 访问量 3799

猜你喜欢

转载自blog.csdn.net/qq_43647628/article/details/105307473