PAT.A1076 Forwards on Weibo

返回目录在这里插入图片描述

题意

在微博中,每个用户都可能被若干其他用户关注。而当该用户发布一条信息时, 他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多只转发该信息一次(信息的最初发布者不能转发该信息)。现在给出N个用户的关注情况(即他们各自关注了哪些用户)以及一一个转发层数上限L,并给出最初发布消息的用户编号,求在转发层数上限内消息最多会被多少用户转发。

样例(可复制)

7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
//output
4
5

注意点

  1. 本题使用BFS更方便
  2. 编号从1开始编号,1-n
  3. 注意使用数组进行标记节点是否被访问过了,防止重复访问
  4. 本题使用两个queue,deep用来存储当前节点的深度depth
#include <bits/stdc++.h>
using namespace std;

vector<int> G[1010];
bool flag[1010];//标记是否访问过
int n,l,k;//节点数n,层数上限l
void BFS(int root,int& num){
	flag[root]=true;
	queue<int> q,deep;
	q.push(root);
	deep.push(0);
	while(!q.empty()){
		int now=q.front(),depth=deep.front();
		q.pop();
		deep.pop();
		if(depth<=l){
			num++;
			for(int i:G[now]){
				if(!flag[i]){
					q.push(i);
					deep.push(depth+1);
                    flag[i]=true;
				}
			}
		}
	}
}
int main(){
	cin>>n>>l;
	for(int i=1;i<=n;i++){
		scanf("%d",&k);
		int t;
		while(k--){
			scanf("%d",&t);
			G[t].push_back(i);
		}
	}
	cin>>k;//k次查询
	while(k--){
		memset(flag,false,sizeof(flag));
		int root,num=0;
		scanf("%d",&root);
		BFS(root,num);
		cout<<num-1<<endl;
	}
	return 0;
}
发布了177 篇原创文章 · 获赞 5 · 访问量 6654

猜你喜欢

转载自blog.csdn.net/a1920993165/article/details/105562639