给出每个微博用户关注的人的数量和下标,求一个用户发微博,最多会有多少个人转发(他粉丝会转发,他粉丝的粉丝会转发他粉丝),计算前L层的人数。
这一题用广度优先搜索就可以做,难点是要把握住层数。
我一开始以为用深度优先搜索也可以做出来,写好一提交有两个测试点没有过去,看一下别人基本都是用广度优先搜索做出来的,用深度优先搜索的基本会有错误。后来尝试多次后,发现用深度优先搜索可能不能做出来,因为会出现跟路径有关的问题,如果存在路径中存在环(即互粉现象),先遍历长路径后,可能遍历不了短路径。改成用set存储路径中的节点,最后一个测试点会超时,于是改用广度优先搜索。
(用时:1:39:42.32)
#include <bits/stdc++.h>
using namespace std;
void bfs(vector<int> user[],int index,int vis[],int level)
{
vis[index] = 1;
queue<int> que;
que.push(index);
que.push(-1);
int l = 0;
int sum = 0;
while(!que.empty()) {
int currentIndex = que.front();
que.pop();
if(currentIndex==-1) {
l++;
if( l>=level) break;
que.push(-1);
continue;
}
for(int i=0; i<user[currentIndex].size(); i++) {
if(!vis[user[currentIndex][i]]) {
vis[user[currentIndex][i]] = 1;
sum++;
que.push(user[currentIndex][i]);
}
}
}
printf("%d\n",sum);
}
int main()
{
int n,l;
scanf("%d%d",&n,&l);
vector<int> user[n+1];
int m,s;
for(int i=0; i<n; i++) {
scanf("%d",&m);
for(int j=0; j<m; j++) {
scanf("%d",&s);
user[s].push_back(i+1);
}
}
int k;
scanf("%d",&k);
int query[k];
for(int i=0; i<k; i++) {
scanf("%d",&query[i]);
}
for(int i=0; i<k; i++) {
int vis[n+1] = {0};
bfs(user,query[i],vis,l);
}
return 0;
}