题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736
总结:先开始,题目没读懂(看来还要好好学英语)
题目大意是这样的,微博的博客可以被你的粉丝转发,你的粉丝又可以转发,就形成了一张复杂的网络。
输入n(总人数),len(最多扩展的深度)输入n行,
每行输入一个k表示第i个人的粉丝人数,和k个人的编号,
最后输入k然后输入k个x询问每次最多可以扩展的人数。
可以用广搜来做,就是要注意深度的判断。一开始我用了两个队列,发现超时,
后来参考了网上的代码,发现可以将vis变为深度,这样既能判断某个节点是否走过,
也能知道当前的深度,以便于结束bfs(妙啊)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1200;
int a[maxn][maxn],vis[maxn],len,n;
queue <int> q;
int bfs(int x)
{
memset(vis,-1,sizeof(vis));
int cnt=0,i,j,num=0;
vis[x]=0;
while(!q.empty()) q.pop();
q.push(x);
while(!q.empty())
{
int tp=q.front();
q.pop();
cnt=vis[tp];
if(cnt>=len) break;
for(i=1;i<=n;i++)
{
if(vis[i]==-1&&a[tp][i])
{
vis[i]=cnt+1;
q.push(i);
num++;
}
}
}
return num;
}
int main(void)
{
int i,j,k,x,y;
scanf("%d%d",&n,&len);
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
scanf("%d",&k);
for(j=0;j<k;j++) scanf("%d",&x),a[x][i]=1;
}
scanf("%d",&k);
for(j=0;j<k;j++)
{
scanf("%d",&x);
printf("%d\n",bfs(x));
}
return 0;
}