#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN = 1010;
// 邻接表表示的图
vector<int> adj[MAXN]; // 这个邻接矩阵正好反着,表明谁的关注列表
bool inq[MAXN] = {false};
int N = 0, L = 0;
int follow_num;
int master_idx;
int user_cnt = 0;
void __bfs(int x){
user_cnt = 0;
queue<int> q;
q.push(x);
inq[x] = true;
//printf("inq %d\n", x);
int lay = 0;
while(!q.empty()){
int lay_len = q.size();
//printf("------------------lay %d\n", lay);
while(lay_len --){
int tmp = q.front();
q.pop();
//printf("-pop %d\n", tmp);
// 从图上按边找入队节点
for(int i = 0; i < adj[tmp].size(); i++){
int ind_flw = adj[tmp][i];
if(!inq[ind_flw]){
//printf("inq %d\n", ind_flw);
inq[ind_flw] = true;
q.push(ind_flw);
user_cnt ++; // 转发数最好在这里就加,别在读节点的时候加
}
}
}
lay ++; // 这样也可以表示层数
if(lay == L){
break;
}
}
}
vector<int> sender;
int cnt = 0;
void bfs_for_map(){
for(int i = 0; i < sender.size(); i++){
//printf("------visit %d\n", sender[i]);
__bfs(sender[i]);
// 恢复成都没有visit状态
fill(inq, inq + N + 1, false);
printf("%d", user_cnt);
if(i != sender.size() - 1){
printf("\n");
}
}
}
int main(){
scanf("%d %d", &N, &L);
// 由关注列表扫描每个人的粉丝列表
for(int i = 1; i <= N; i++){
scanf("%d", &follow_num);
while(follow_num --){
scanf("%d", &master_idx);
adj[master_idx].push_back(i);
}
}
// // 这样建出来的图就是每个人的粉丝表
// // 发消息谁可以看见
// for(int i = 1; i <= N; i ++){
// if(adj[i].size() == 0) printf("0");
// for(int j = 0; j < adj[i].size(); j++){
// printf("%d ", adj[i][j]);
// }
// printf("\n");
// }
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &master_idx);
sender.push_back(master_idx);
}
bfs_for_map();
return 0;
}
【机试练习】【C++】【PTA A1076 Forwards on Weibo】
最新推荐文章于 2023-05-09 20:37:01 发布