题目
思路
题目大意:给一个社交网络,当一个博主发布动态后其关注者会进行转发,在一定的转发层数内求出一共有多少个人转发该动态;
先用邻接表把网络关系存储下来,为什么要用邻接表,因为不涉及权值问题;
对于给定博主,采用BFS的做法迭代,注意在对每个博主进行BFS时,要将vis数组整体赋值为false,用于记录一个用户是否入过队,不能重复入队(即不能重复转发);
至于层数的控制,需要每次入队前判断这个元素所在层数是否小于等于k;
代码
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 1010;
struct node{
int id, level;
}Node;
vector<vector<int>> graph;
int n, level;
bool vis[maxn];
int BFS(int u){
queue<node> Q;
Node.id = u, Node.level = 0;
Q.push(Node);
vis[u] = true;
node top;
int ans = 0;
while(!Q.empty()){
top = Q.front();
Q.pop();
ans ++;//只要出过队就可以算数,因为入队的都是会转发的
for(int i = 0; i < graph[top.id].size(); i ++){
if(vis[graph[top.id][i]] == false){
Node.id = graph[top.id][i], Node.level = top.level + 1;
//只有在小于等于给定level时才会压入队列,当大于level时,一个也不会入队,结束迭代
if(Node.level <= level) {
Q.push(Node);
vis[Node.id] = true;//标记已经入过队
}
}
}
}
return ans;
}
int main()
{
graph.resize(maxn);
scanf("%d%d", &n, &level);
int k, u;
for(int i = 1; i <= n; i ++){
scanf("%d", &k);
for(int j = 0; j < k; j ++){
scanf("%d", &u);
graph[u].push_back(i);
}
}
scanf("%d", &k);
for(int i = 0; i < k; i ++){
scanf("%d", &u);
//每次换一个博主后需要对数组全部标记为未入队
fill(vis, vis + maxn, false);
printf("%d\n", BFS(u) - 1);
}
system("pause");
return 0;
}