要注意理解好题意,题目input给的是某人v关注了哪些人,而不是v被那些人关注,输出要求统计一个人发动态在L限制内有多少人转发,因此建图时v关注了w,则有一条w指向v的边,表示w发动态v会转发,这样v是w的邻接点,感觉这道题坑就坑在如何建图了。
另外注意memset第三个参数是字节数,所以想让前N+1个位置重新置零需要传递4*(N+1),保险起见还是用sizeof(inq)吧。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct Node{
int v;
int level;
Node(int _v,int _level){
v=_v;
level=_level;
}
Node(){
}
};
vector<Node> G[1005];
int inq[1005]={0};//每次重新统计另一个人时需要清零
int BFS(int v,int L){
inq[v]=1;//顶点v入队
queue<Node> q;
q.push(Node(v,0));
int res=0;
while(!q.empty()){
Node tmp=q.front();
q.pop();
if(tmp.level<=L) res++;
else break;
for(auto w:G[tmp.v]){
if(!inq[w.v]) {
inq[w.v] = 1;
w.level = tmp.level + 1;
q.push(w);
}
}
}
return res-1;//除去顶点自己
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int N,L;
cin >> N >> L;
for(int i=1;i<=N;i++){
int tmp;
cin >> tmp;
while(tmp--){
int W;
cin >> W;
G[W].push_back(Node(i,0));
}
}
int K;
cin >> K;
while(K--){
memset(inq,0,sizeof(inq));
int V;
cin >> V;
int res=BFS(V,L);
cout << res << endl;
}
return 0;
}