题目链接:点击打开链接
题目大意:给出每个用户关注的人的 id 和转发最多的层数,求一个 id 发了条微博最多会有多少个人转发?
解题思路:带层数的广度优先,因为一个用户只能转发一次,所以用 vis 判断当前结点是否入队过了,如果入队过了就不能重复入队(重复转发消息),控制不超过 L 层。
AC 代码
using namespace std;
typedef long long ll;
const int maxn=1010;
struct node
{
    int id,lvl;
    node(){}
    node(int id,int lvl):id(id),lvl(lvl){}
};
int n,l;
vector<int> v[maxn];
int bfs(int id)
{
    int cnt=0, vis[maxn]={0};
    vis[id]=1;
    queue<node> q;
    q.push(node(id,0));
    node nd;
    while(!q.empty())
    {
        nd=q.front(); q.pop();
        int tid=nd.id, lvl=nd.lvl;
        for(int i=0;i<v[tid].size();i++)
        {
            int newid=v[tid][i];
            if(!vis[newid] && lvl<l)
            {
                q.push(node(newid,lvl+1));
                vis[newid]=1;
                cnt++;
            }
        }
    }
    return cnt;
}
int main()
{
    int m,tid;
    scanf("%d%d",&n,&l);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d",&tid);
            v[tid].push_back(i);
        }
    }
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&tid);
        printf("%d\n",bfs(tid));
    }
    return 0;
}









