题目大意:给出N个微博用户,编号1~N,并给出他们每个人的关注列表。求出当编号为M的人发微博时,传播L层,有多少人能看到。
根据关注列表构建有向图,求从顶点 M 开始的 bfs 层数小于等于L的顶点数。数据没有什么坑点。因为要保证最多计数到L层,必须在 bfs 过程中记录层数。
AC代码:
#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;
struct person
{
int id;
int layer;
person(int id, int layer):id(id), layer(layer){};
};
int bfs(int index, int maxL, vector<vector<int>> &G)
{
vector<bool> inq(G.size(), 0);
queue<person> q;
q.push(person(index, 0));
inq[index] = true;
int cnt = 0;
while(!q.empty())
{
person now = q.front();
q.pop();
for (int i = 0; i < G[now.id].size(); ++i)
{
int nextId = G[now.id][i];
if(inq[nextId] == false && now.layer < maxL)
{
inq[nextId] = true;
q.push(person(nextId, now.layer + 1));
cnt++;
}
}
}
return cnt;
}
int main()
{
int N, L, K;
cin >> N >> L;
vector<vector<int>> G(N+1);
for (int i = 1; i <= N; ++i)
{
int cnt;
scanf("%d", &cnt);
for (int j = 0; j < cnt; ++j)
{
int id;
scanf("%d", &id);
G[id].push_back(i);
}
}
scanf("%d", &K);
for (int query = 0; query < K; ++query)
{
int id;
scanf("%d", &id);
cout << bfs(id, L, G) << endl;
}
return 0;
}