PAT甲级1076Forwards on Weibo
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736
题解
题目要求
- 给定一个社交网络,请计算某用户的最大转发量(只计算L层间接关注者,假设一条微博,每个人只能转发一次)。
- 输入
- N:正整数,不超过1000,用户的数量,索引为[1,N]
- L:正整数,不超过6,需要计算的间接关注者的层数
- N个用户分别关注了哪些用户:每个用户关注的用户列表
- K:正整数,要查询的用户的数量
- K个要查询的用户:
 
- 输出
解题思路
- 需要判断层次的BFS:通过类来保存每个结点的层次即可
代码
// Problem: PAT Advanced 1076
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736
// Tags: 图 BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 1001;
int n, l;
bool visit[MAXN];
vector<int> followers[MAXN];
struct User{
    int id,layer;
};
int bfs(int tempID){
    queue<User> users;
    users.push({tempID, 0});
    visit[tempID] = true;
    int ret = 0;
    while (!users.empty()){
        User u = users.front();
        users.pop();
        for (auto it = followers[u.id].begin(); it != followers[u.id].end(); it++){
            if (!visit[*it] && u.layer < l){
                visit[*it] = true;
                users.push({*it, u.layer + 1});
                ret++;
            }
        }
    }
    return ret;
}
int main()
{
    scanf("%d %d", &n, &l);
    int tempUser, m;
    for(int i = 1; i <= n; i++){
        scanf("%d", &m);
        for(int j = 0; j < m; j++){
            scanf("%d", &tempUser);
            followers[tempUser].push_back(i);
        }
    }
    int k;
    scanf("%d", &k);
    while(k--){
        scanf("%d", &tempUser);
        fill(visit, visit + MAXN, false);
        printf("%d\n", bfs(tempUser));
    }
    return 0;
}
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号