题目
题目大意
已知微博上粉丝都可能会转发自己所关注的人的动态,给定总人数n和层数l,和每个id关注的人数及所关注人的id。要求查询一组用户的潜在转发量,粉丝层级不能超过l。
思路
求潜在转发量,就是一层一层的找粉丝数,用bfs。图可以用二维数组来表示。层数不能超过l,则需要记录bfs的队列中的节点层数。每入队一层,接下来一层要入队的节点层数需+1。所以要将节点值和层数绑定在一起,队列的要存储{节点值,层数}结构体。
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node{
int id;
int level;
}; // 进入bfs时,节点需要和层数绑定
vector<vector<int>> v;
int n, l, k;
int bfs(node user){
queue<node> q;
q.push(user);
bool b[1001] = {false};
b[user.id] = true;
int count = 0; // 最大转发量
while (!q.empty()){
node nowUser = q.front();
q.pop();
for (int i = 0; i < (int)v[nowUser.id].size(); i++){
if (!b[v[nowUser.id][i]] && nowUser.level < l){
node newUser = {v[nowUser.id][i], nowUser.level + 1};
q.push(newUser);
b[newUser.id] = true;
count++;
}
}
}
return count;
}
int main(){
cin >> n >> l;
v.resize(n + 1);
for (int i = 1; i <= n; i++){
int m;
cin >> m; // 注意是关注的人数,不是粉丝数
for (int j = 0; j < m; j++){
int num;
cin >> num;
v[num].push_back(i);
}
} // 构造图
cin >> k;
for (int i = 0; i < k; i++){
int id;
cin >> id;
node user = {id, 0};
cout << bfs(user) << endl;
}
return 0;
}