返回目录
题意
在微博中,每个用户都可能被若干其他用户关注。而当该用户发布一条信息时, 他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多只转发该信息一次(信息的最初发布者不能转发该信息)。现在给出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
注意点
- 本题使用BFS更方便
- 编号从1开始编号,1-n
- 注意使用数组进行标记节点是否被访问过了,防止重复访问
- 本题使用两个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;
}