本题很显然需要用广度优先搜索BFS。有两点需要注意:
1、where M[i]
(≤100) is the total number of people that user[i]
follows
是follows,而不是be followed。
2、存在互相follow的情况,但自己不能转发自己的,因此在一开始就要把帖子原作者标记掉,不参与转发。
#include<stdio.h>
#include<vector>
#include<memory.h>
using namespace std;
bool mark[1001];
vector<int> follower[1001];
int BFS(int L, vector<int> Q, int sum, int maxL)
{
if (L > maxL)
{
return sum;
}
vector<int> next;
for (int i = 0; i < Q.size(); i++)
{
for (int j = 0; j < follower[Q[i]].size(); j++)
{
if (mark[follower[Q[i]][j]] == false)
{
mark[follower[Q[i]][j]] = true;
sum++;
next.push_back(follower[Q[i]][j]);
}
}
}
sum = BFS(L + 1, next, sum,maxL);
return sum;
}
int main()
{
int N, L;
scanf("%d%d", &N, &L);
for (int i = 1; i <= N; i++)
{
int num;
scanf("%d", &num);
for (int j = 0; j < num; j++)
{
int f;
scanf("%d", &f);
follower[f].push_back(i);
}
}
int K;
scanf("%d", &K);
for (int i = 0; i < K; i++)
{
memset(mark, 0, sizeof(bool) * 1001);
int qerry;
scanf("%d", &qerry);
mark[qerry] = true;
vector<int> Q;
Q.push_back(qerry);
printf("%d\n", BFS(1, Q, 0, L));
}
return 0;
}