PAT Advanced Level 1076. Forwards on Weibo (30)

来源:互联网 发布:学校网关闭游戏端口 编辑:程序博客网 时间:2024/06/02 06:37

【来源】

1076. Forwards on Weibo (30)

【分析】

本题给出微博用户的关注情况,在假定某一用户的粉丝看到某条微博一定会转发的情况下,求可能被转发的次数。

抽象一下就是一个限定了层数的广度优先搜索(BFS)。

基本的数据结构是以vector为元素类型的一个vector。该vector的index和用户id相关,index所对应的元素为此id的粉丝们。

给定发微博的用户以后,先设定除博主之外的所有用户都没有转发。然后用一个队列来进行BFS,出队时将此用户的转发设置为True。遍历完毕之后统计标记为True的用户的数量,输出即可。

为了统计搜索的层数,每次搜索之前我们把队列中的最后一个元素记录下来,为endofLevel 变量。每当我们发现出队的元素为endofLevel时,表明一层遍历的结束,然后更新endofLevel的值并将层数加1。当层数达到所限定的层数L时,停止搜索即可。

【代码】

#include <iostream>#include <cstdio>#include <vector>#include <deque>using namespace std;int main(){    int N, L;    scanf("%d%d", &N, &L);    vector<vector<int>> fans(N);    for (int i = 0; i < N; ++i){        int num;        scanf("%d", &num);        for (int j = 0; j < num; ++j){            int followee;            scanf("%d", &followee);            fans[followee-1].push_back(i);        }    }        int K;    scanf("%d", &K);        for (int i = 0; i < K; ++i){        bool* hasfoward = new bool[N];        for (int i = 0; i < N; ++i){            hasfoward[i] = false;        }        int blogger;        scanf("%d", &blogger);        hasfoward[blogger - 1] = true;        deque<int> queue;        queue.push_back(blogger - 1);                int currentlevel = 0;        int last = blogger - 1;        int endOfLevel = queue.back();        while (!queue.empty()){             int front = queue.front();            queue.pop_front();              hasfoward[front] = true;            for (int j = 0; j < fans[front].size(); ++j){                if (!hasfoward[fans[front][j]]){                    queue.push_back(fans[front][j]);                    hasfoward[fans[front][j]] = true;                                    }            }            if (front == endOfLevel)            {                endOfLevel = queue.back();                ++currentlevel;            }            if (currentlevel >= L){                break;            }                    }        int fowards = 0;        for (int i = 0; i < N; ++i){            if (hasfoward[i]){                ++fowards;            }        }        printf("%d\n", fowards-1);        delete[] hasfoward;    }        system("pause");    return 0;}
【点评】

此题考察BFS的应用,以及BFS层数计数问题。注意记录下某一用户的粉丝,而不是像题目给出的那样记录关注的人,这样搜索起来会很方便。

0 0
原创粉丝点击