微博被称为中文版的 Twitter。
微博上的用户既可能有很多关注者,也可能关注很多其他用户。
因此,形成了一种基于这些关注关系的社交网络。
当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…
现在给定一个社交网络,假设只考虑 L 层关注者,请你计算某些用户的帖子的最大可能转发量。
补充
如果 B 是 A 的关注者,C 是 B 的关注者,那么 A 的第一层关注者是 B,第二层关注者是 C。
输入格式
第一行包含两个整数,N 表示用户数量,L 表示需要考虑的关注者的层数。
假设,所有的用户的编号为 1∼N。
接下来 N 行,每行包含一个用户的关注信息,格式如下:
M[i] user_list[i]
M[i]
是第 i 名用户关注的总人数,user_list[i]
是第 i 名用户关注的 M[i]
个用户的编号列表。
最后一行首先包含一个整数 K,表示询问次数,然后包含 K 个用户编号,表示询问这些人的帖子的最大可能转发量。
输出格式
按顺序,每行输出一个被询问人的帖子最大可能转发量。
假设每名用户初次看到帖子时,都会转发帖子,只考虑 L 层关注者。
数据范围
1≤N≤1000,
1≤L≤6,
1≤M[i]≤100,
1≤K≤N
输入样例:
7 3 3 2 3 4 0 2 5 6 2 3 1 2 3 4 1 4 1 5 2 2 6
输出样例:
4 5
分析:
一层一层遍历首先想到BFS,l为限制条件,加入BFS中,计算最大个数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1010;
vector<int> a[N];
bool st[N];
int n,l;
int bfs(int x)
{
memset(st,false,sizeof st);
queue<int> q;
q.push(x);
st[x]=true;
int sum=1;
for(int i=0;i<l;i++)
{
int s=q.size();
while(s--)
{
int t=q.front();
q.pop();
for(int i=0;i<a[t].size();i++)
{
int j=a[t][i];
if(!st[j])
{
st[j]=true;
sum++;
q.push(j);
}
}
}
}
return sum;
}
int main()
{
scanf("%d %d",&n,&l);
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
while(k--)
{
int x;
scanf("%d",&x);
a[x].push_back(i);
}
}
int k;
scanf("%d",&k);
while(k--)
{
int x;
scanf("%d",&x);
printf("%d\n",bfs(x)-1);
}
return 0;
}