题目
post n. 岗位;邮件;标杆 vt. 张贴;公布;邮递;布置
解决
思路
建图的时候,根据样例,可以认识到应该是被关注者指向关注者,建立邻接表。注意:
每一次BFS之前,需要初始化inq[MAXV]数组
实现
Code1
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int MAXV = 1010;
struct Node{
int id;
int layer;
};
vector<Node> Adj[MAXV];
bool inq[MAXV] = {false};
void inqInit(){
for(int i=0; i<MAXV; i++){
inq[i] = false;
}
}
int BFS(int s, int L){
int cnt = 0;
queue<Node> q;
Node node;
node.id = s;
node.layer = 0;
q.push(node);
inq[node.id] = true;
while(!q.empty()){
Node top = q.front();
q.pop();
int u = top.id;
for(int i=0; i<Adj[u].size(); i++){
Node next = Adj[u][i];
next.layer = top.layer + 1;
if(inq[next.id] == false && next.layer <= L){
q.push(next);
inq[next.id] = true;
cnt++;
}
}
}
return cnt;
}
int main(){
int n, L;
scanf("%d%d", &n, &L);
Node user;
int k, idFollow;
for(int i=1; i<=n; i++){ // user[i]:1~N
user.id = i;
scanf("%d", &k); //i关注的人数
for(int j=0; j<k; j++){
scanf("%d", &idFollow);
Adj[idFollow].push_back(user); // 被关注者->用户i,被关注的人的微博可以被i看到
}
}
int numQuery, s;
scanf("%d", &numQuery);
for(int i=0; i<numQuery; i++){
inqInit();
scanf("%d", &s);
int ans = BFS(s, L);
printf("%d\n", ans);
}
return 0;
}