当前位置:   article > 正文

《蓝桥杯每日一题》bfs·AcWing1562. 微博转发_bfs试炼之微博转发

bfs试炼之微博转发

1.题目描述

微博被称为中文版的 Twitter。

微博上的用户既可能有很多关注者,也可能关注很多其他用户。

因此,形成了一种基于这些关注关系的社交网络

当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…

现在给定一个社交网络,假设只考虑 L 层关注者,请你计算某些用户的帖子的最大可能转发量。

补充

如果 BA 的关注者,CB 的关注者,那么 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

2.题目思路

1号用户关注了2号,就连一条2到1得边,表示2发的微博会被1转发

当询问2号用户微博的转发量时,使用bfs从2号开始一层一层遍历可到达的点,遍历过程中记录层数,

注意层数不能超过题目要求的L

3.Ac代码

  1. import java.util.*;
  2. public class Main {
  3. static int N=100010;
  4. static int h[]=new int[N],e[]=new int[N],ne[]=new int[N];
  5. static boolean st[] = new boolean[N];
  6. static int n,l,idx;
  7. public static void main(String[] args) {
  8. Scanner sc=new Scanner(System.in);
  9. n=sc.nextInt(); l=sc.nextInt();
  10. Arrays.fill(h,-1);
  11. //将每个人的关注者连向自己
  12. for(int i=1;i<=n;i++){
  13. int n1=sc.nextInt();
  14. while (n1-->0){
  15. int x=sc.nextInt();
  16. //建邻接表
  17. add(x,i);
  18. }
  19. }
  20. int k=sc.nextInt();
  21. while (k-->0){
  22. int t=sc.nextInt();
  23. System.out.println(bfs(t));
  24. }
  25. }
  26. private static Integer bfs(int x){
  27. Arrays.fill(st,false);
  28. Queue<Integer> q=new LinkedList<>();
  29. q.offer(x);
  30. st[x]=true;
  31. int res=0;
  32. //枚举每一层层数
  33. for(int i=0;i<l;i++){
  34. int size=q.size();
  35. /* 枚举每一层的每一个点 判断该点的子节点是否被枚举过
  36. 如果没有则把该子节点加入队列中 当枚举到这一层的最后一个点时
  37. 该层的点已被全部删除 此时队列里只有下一层的点了 while循环结束 继续for循环枚举下一层*/
  38. while (size-->0) {
  39. int t = q.poll();
  40. for(int j=h[t];j!=-1;j=ne[j]){
  41. int tt=e[j];
  42. if(st[tt]==false){
  43. q.offer(tt);
  44. st[tt]=true;
  45. res++;
  46. }
  47. }
  48. }
  49. }
  50. return res;
  51. }
  52. private static void add(int a, int b) {
  53. e[idx]=b; ne[idx]=h[a]; h[a]=idx++;
  54. }
  55. }
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/302832
推荐阅读
相关标签
  

闽ICP备14008679号