PAT甲级(Advanced Level)1076(图BFS)

微博被称为中国版的Twitter。微博上的一个用户可能有很多追随者,也可能关注很多其他用户。因此,一个具有追随者关系的社会网络就形成了。当一个用户在微博上发了一个帖子,他/她的所有追随者都可以查看并转发他/她的帖子,然后他/她的追随者也可以再次转发。现在给定一个社交网络,你应该计算出任何特定用户的最大潜在转发量,假设只计算L级的间接关注者。

输入规范。

每个输入文件包含一个测试案例。对于每个案例,第一行包含2个正整数。N(<=1000),用户数;L(<=6),被计算的间接追随者的级别数。因此,我们假设所有的用户都是从1到N编号的。然后是N行,每行的格式是

M[i] user_list[i] 。

其中M[i](<=100)是用户[i]关注的总人数;而user_list[i]是用户[i]关注的M[i]用户的列表。可以保证没有人可以关注自己。所有的数字都用空格隔开。

然后最后给出一个正K,后面是K个UserID的查询。

输出规范。

对于每个UserID,你应该在一行中打印出这个用户可以转发的最大潜在数量,假设每个人都能看到 的人都会转发一次,而且只有L级的间接关注者被计算在内。

输入样本。

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

《原题传送门》https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805392092020736

题目大意:一一个有向图的给定结点进行bfs,记录路径长度小于L的结点个数;

分析:图基本的层级bfs问题,经典三板斧(图,判断数组,queue),加对结点采用结构体类型存储即可,细节问题不一一赘述;

代码参考于柳神

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
vector<vector<int>> arcs;
vector<int>ans;
int n, k, l,visit[1001];
typedef struct  Node {
	int id, layer;
}Node;
int bfs(Node a) {
	int peo = 0;
	queue<Node> qu;
	qu.push(a);
	visit[a.id] = 1;
	while (!qu.empty()) {
		for (int i = 0; i < arcs[qu.front().id].size(); i++) {
			if (visit[arcs[qu.front().id][i]] == 0 && qu.front().layer<l) {
				visit[arcs[qu.front().id][i]] = 1;
				Node temp = { arcs[qu.front().id][i] ,qu.front().layer + 1 };
				qu.push(temp);
				peo++;
			}
		}
		qu.pop();
	}
	return peo;
}
int main() {
	cin >> n >> l;
	arcs.resize(n + 1);
	for (int i = 1; i <= n; i++) {
		int m, u;
		cin >> m;
		for (int j = 0; j < m; j++) {
			cin >> u;
			arcs[u].push_back(i);
		}
	}
	cin >> k;
	for (int i = 0; i < k; i++){
		Node temp;
		cin >> temp.id;
		temp.layer = 0;
		fill(visit, visit + n + 1, 0);
		ans.push_back(bfs(temp));
	}
	for (int i = 0; i < k;i++) {
		cout << ans[i] << endl;
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值