版权声明: https://blog.csdn.net/Dream_Weave/article/details/82055957
题目链接:点击打开链接
题目大意:给出每个用户关注的人的 id 和转发最多的层数,求一个 id 发了条微博最多会有多少个人转发?
解题思路:带层数的广度优先,因为一个用户只能转发一次,所以用 vis 判断当前结点是否入队过了,如果入队过了就不能重复入队(重复转发消息),控制不超过 L 层。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
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;
}