【来源】
【分析】
本题给出微博用户的关注情况,在假定某一用户的粉丝看到某条微博一定会转发的情况下,求可能被转发的次数。
抽象一下就是一个限定了层数的广度优先搜索(BFS)。
基本的数据结构是以vector为元素类型的一个vector。该vector的index和用户id相关,index所对应的元素为此id的粉丝们。
给定发微博的用户以后,先设定除博主之外的所有用户都没有转发。然后用一个队列来进行BFS,出队时将此用户的转发设置为True。遍历完毕之后统计标记为True的用户的数量,输出即可。
为了统计搜索的层数,每次搜索之前我们把队列中的最后一个元素记录下来,为endofLevel 变量。每当我们发现出队的元素为endofLevel时,表明一层遍历的结束,然后更新endofLevel的值并将层数加1。当层数达到所限定的层数L时,停止搜索即可。
【代码】
#include <iostream>
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;
int main()
{
int N, L;
scanf("%d%d", &N, &L);
vector<vector<int>> fans(N);
for (int i = 0; i < N; ++i){
int num;
scanf("%d", &num);
for (int j = 0; j < num; ++j){
int followee;
scanf("%d", &followee);
fans[followee-1].push_back(i);
}
}
int K;
scanf("%d", &K);
for (int i = 0; i < K; ++i){
bool* hasfoward = new bool[N];
for (int i = 0; i < N; ++i){
hasfoward[i] = false;
}
int blogger;
scanf("%d", &blogger);
hasfoward[blogger - 1] = true;
deque<int> queue;
queue.push_back(blogger - 1);
int currentlevel = 0;
int last = blogger - 1;
int endOfLevel = queue.back();
while (!queue.empty()){
int front = queue.front();
queue.pop_front();
hasfoward[front] = true;
for (int j = 0; j < fans[front].size(); ++j){
if (!hasfoward[fans[front][j]]){
queue.push_back(fans[front][j]);
hasfoward[fans[front][j]] = true;
}
}
if (front == endOfLevel)
{
endOfLevel = queue.back();
++currentlevel;
}
if (currentlevel >= L){
break;
}
}
int fowards = 0;
for (int i = 0; i < N; ++i){
if (hasfoward[i]){
++fowards;
}
}
printf("%d\n", fowards-1);
delete[] hasfoward;
}
system("pause");
return 0;
}
【点评】
此题考察BFS的应用,以及BFS层数计数问题。注意记录下某一用户的粉丝,而不是像题目给出的那样记录关注的人,这样搜索起来会很方便。