本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1562. 微博转发
原题传送:AcWing 1562. 微博转发
微博被称为中文版的Twitter。
微博上的用户既可能有很多关注者,也可能关注很多其他用户。
因此,形成了一种基于这些关注关系的社交网络。
当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…
现在给定一个社交网络,假设只考虑 层关注者,请你计算某些用户的帖子的最大可能转发量。
补充
如果 是 的关注者, 是 的关注者,那么 的第一层关注者是 ,第二层关注者是 。
输入格式
第一行包含两个整数, 表示用户数量, 表示需要考虑的关注者的层数。
假设,所有的用户的编号为 。
接下来 行,每行包含一个用户的关注信息,格式如下:
M[i] user_list[i]
M[i] 是第 名用户关注的总人数,user_list[i] 是第 名用户关注的 M[i] 个用户的编号列表。
最后一行首先包含一个整数 ,表示询问次数,然后包含 个用户编号,表示询问这些人的帖子的最大可能转发量。
输出格式
按顺序,每行输出一个被询问人的帖子最大可能转发量。
假设每名用户初次看到帖子时,都会转发帖子,只考虑 层关注者。
数据范围
, , ,
输入样例:
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按层遍历,最后输出前n层的点数+下一层的点数-起始点。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, M = 100010;
int n, m;
int h[N], e[M], ne[M], idx;
bool st[N];
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int bfs(int start)
{
queue<int> q;
memset(st, 0, sizeof st);
q.push(start);
st[start] = true;
int res = 0;
for(int step = 0; step < m; step++)
{
int sz = q.size();
res += sz;
for(int i = 0; i < sz; i++)
{
int t = q.front();
q.pop();
for(int j = h[t]; ~j; j = ne[j])
{
int k = e[j];
if(!st[k])
{
st[k] = true;
q.push(k);
}
}
}
}
return res + q.size() - 1;
}
int main()
{
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
for(int i = 1; i <= n; i++)
{
int cnt;
scanf("%d", &cnt);
while(cnt--)
{
int x;
scanf("%d", &x);
add(x, i);
}
}
int k;
scanf("%d", &k);
while(k--)
{
int x;
scanf("%d", &x);
printf("%d\n", bfs(x));
}
return 0;
}