微博转发——BFS

这篇文章介绍了一种处理社交网络中用户关注关系的方法。给定用户IDx和层数L,通过反向构建关注图并从x开始进行深度优先搜索,计算在不超过L层内关注用户x的人数。关键在于反向建图以简化搜索过程,并使用层次遍历记录距离。
摘要由CSDN通过智能技术生成

原题链接https://www.acwing.com/problem/content/1564/

思路分析

由题可知,题目会给出一个用户编号x,以及层数L,而我们需要根据输入的用户之间互相的关注情况,来求出用户x 在不超过L的层数的前提下,有多少用户是关注x的

但是对于题目的输入数据,如果按照这个存图方式:即第 i 位用户关注的用户 j

v[i].push_back(j)

容易发现,这样子并不容易搜索第 j 位用户被谁搜索了(且要搜索L层)

所以,我们可以反向建图 即 v[j].push_back(i)

所以,总的思路即:

反向建图,然后从目标x开始搜索,搜索L层,看能搜索到多少个

注意: 记录层数时,可以用一个判断数组,如果未出现过,就层数+1,否则不加

if (!st[v[a][j]])
{
	st[v[a][j]] = 1;
	q.push(v[a][j]);
	dist[v[a][j]] = dist[a] + 1;//记录层数!!!!
}

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>

using namespace std;

int n, l;
vector<int> v[1005];
int st[1005];	int dist[1005];
int res; int cnt;

int solve(int x)
{
	memset(dist, 0, sizeof dist);
	memset(st, 0, sizeof st);
	res = 0;
	cnt = 0;
	queue<int> q;
	q.push(x);
	st[x] = 1;

	while (!q.empty())
	{
		int a = q.front();
		q.pop();
		int j = 0;
		while (j < v[a].size())
		{
			if (!st[v[a][j]])
			{
				st[v[a][j]] = 1;
				q.push(v[a][j]);
				dist[v[a][j]] = dist[a] + 1;//记录层数!!!!
			}
			j++;
		}

	}
	for (int i = 1; i <= n; i++)
	{
		if (dist[i] >= 1 && dist[i] <= l)
			cnt++;
	}

	return cnt;
}
int main()
{
	int k = 0;
	cin >> n >> l;

	for (int i = 1; i <= n; i++)
	{
		int x = 0; int xx = 0;
		cin >> x;
		for (int j = 1; j <= x; j++)
		{
			cin >> xx;
			v[xx].push_back(i);//反向建图!!!
		}
	}
	cin >> k;
	while (k--)
	{
		int x = 0;
		cin >> x;
		cout << solve(x) << "\n";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值