首页 > 其他分享 >2023.3.1AcWing蓝桥杯集训·每日一题

2023.3.1AcWing蓝桥杯集训·每日一题

时间:2023-03-01 20:11:13浏览次数:57  
标签:2023.3 int 转发 用户 蓝桥 关注 层数 1AcWing BFS

今日的知识点为 \(BFS\) (广度优先搜素)。

\(BFS\)

简要介绍下 \(BFS\) 算法。首先,\(BFS\) 算法适用于边权为 \(1\) 的图论问题。\(BFS\) 算法的解题思路也比较固定。确定初始状态,然后对初始状态拓展。大致的解题模板如下

初始化 queue
while queue 不空
{
	t 为队头
	for (拓展队头)
	{
		if (!st) 加至队尾
	}
}

那么由上可见 \(BFS\) 算法离不开队列(\(queue\))以及判重数组(\(st\))。大多数情况下,在入队时,需要进行判重,确保每个点只遍历一次。

AcWing1562.微博转发

题目描述

微博被称为中文版的 \(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\) 算法解这道题。首先,这道题是给定我们层数限制,尽可能多的拓展,和 \(BFS\) 算法的思想很契合。那么我们就可以先采用邻接表来存储所有的信息,被关注着者为表头,关注者为节点。在最初的提交时,笔者忽视了层数限制这一条件,这里笔者使用的是记录每个用户的层数,关注者层数=被关注者层数+1。当我们要拓展的关注者其所在的层数到达限制时,我们就不再进行拓展了,就可以 break

C++代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1010, M = 100010;
typedef pair<int, int> PII;

int n, L, K;
int h[N], e[M], ne[M], idx;
bool st[N];
PII q[N]; // first为点,second为层

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

int bfs(int u)
{
    int hh = 0, tt = -1;
    q[++ tt] = {u, 0};
    st[u] = true;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        if (t.second == L) break;
        for (int i = h[t.first]; ~i; i = ne[i])
        {
            int j = e[i];
            if (!st[j])
            {
                q[++ tt] = {j, t.second + 1};
                st[j] = true;
            }
        }
    }
    return tt;
}

int main()
{
    scanf("%d%d", &n, &L);
    memset(h, -1, sizeof h);
    for (int i = 1; i <= n; i ++)
    {
        int m;
        scanf("%d", &m);
        while (m --)
        {
            int j;
            scanf("%d", &j);
            add(j, i); // i关注j
            // cout << j << ' ' << i << ' ';
        }
    }
    scanf("%d", &K);
    while (K --)
    {
        memset(st, 0, sizeof st);
        int u;
        scanf("%d", &u);
        printf("%d\n", bfs(u));
    }
    return 0;
}

标签:2023.3,int,转发,用户,蓝桥,关注,层数,1AcWing,BFS
From: https://www.cnblogs.com/Cocoicobird/p/17169533.html

相关文章

  • P8631 [蓝桥杯 2015 国 AC] 切开字符串 题解
    P8631[蓝桥杯2015国AC]切开字符串题解前言看到这题没有人写题解,就打算写一篇。这也是蒟蒻的第一篇题解。前置知识\(manacher\),\(SA\)。如果不会可以转至mana......
  • 每日算法--2023.3.1
    1.剑指offer47--礼物的最大价值classSolution{publicintmaxValue(int[][]grid){intm=grid.length,n=grid[0].length;int[][]dp=......
  • 2023.2.27AcWing蓝桥杯集训·每日一题
    复习的知识点为哈希。AcWing840.模拟散列表题目描述维护一个集合,支持如下几种操作:Ix,插入一个数\(x\);Qx,询问数\(x\)是否在集合中出现过;现在要进行\(N\)次操......
  • 蓝桥杯备战日志(Python)19-阅兵方阵&删除字符-(平方和频次统计&字符串字典序)
    阅兵方阵原题X国要参加同盟阅兵活动。主办方要求每个加盟国派出的士兵恰好能组成2个方阵。X国发现弱小的Y国派出了130人的队伍,他们的士兵在行进中可以变换2种队......
  • 2023.2.28AcWing蓝桥杯集训·每日一题
    今日复习的知识点为Tire树(字典树)。字典树可用于快速存储和查找字符串,并且\(0-1\)字典树也可以用于解决异或问题。AcWing3485.最大异或和题目描述给定一个非负整数数......
  • 蓝桥杯2021国赛:巧克力 【贪心】
    题目描述小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝......
  • 蓝桥杯备战日志(Python)18-第几个幸运数字-(枚举只含某些因子的整数)
    第几个幸运数字原题到X星球旅行的游客都被发给一个整数,作为游客编号。X星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7就可以获得一......
  • 蓝桥杯训练赛二-问题 A
    题目描述用简单素数筛选法求N以内的素数。输入N输出2~N的素数样例输入100样例输出23571113171923293137414347535961677173798......
  • 2023.2.24AcWing蓝桥杯集训·每日一题
    今日复习的知识点为递归。递归对于笔者而言是个比较难以理解的知识点,后续会多进行递归题目的练习。AcWing1497.树的遍历题目描述一个二叉树,树中每个节点的权值互不相同......
  • 2023.2.25AcWing蓝桥杯集训·每日一题
    今日复习的知识点为并查集。AcWing1249.亲戚题目描述或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整......