原题:1076. Forwards on Weibo (30)
解题思路:
实际上就是bfs对应的层数并求出点的数量,注意在输入数据时有向边应由被关注者指向关注者,方便处理。
在结点内维护一个level表示层数,在bfs就能判断当前的层了。
代码如下:
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 1000 + 5;
struct Node
{
int level;
vector<int> next;
} G[maxn];
int vis[maxn];
int bfs(int l, int st)
{
memset(vis, 0, sizeof(vis));
queue<Node> q;
G[st].level = 0;
q.push(G[st]);
vis[st] = 1;
int cnt = 0;
while(!q.empty())
{
Node top = q.front(); q.pop();
if(top.level > l) return cnt; //超过要求的层数,返回
else cnt++;
for(int i = 0; i < top.next.size(); i++)
{
if(!vis[top.next[i]])
{
G[top.next[i]].level = top.level + 1;
vis[top.next[i]] = 1;
q.push(G[top.next[i]]);
}
}
}
return cnt; //注意可能会有全部遍历完的情况
}
int main()
{
int n, l, q;
while(scanf("%d%d", &n, &l) == 2)
{
for(int i = 1; i <= n; i++) G[i].next.clear();
for(int i = 1; i <= n; i++)
{
int m, ne;
scanf("%d", &m);
for(int j = 0; j < m; j++)
{
scanf("%d", &ne);
G[ne].next.push_back(i);
}
}
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
int x;
scanf("%d", &x);
printf("%d\n", bfs(l, x)-1); //去掉原作者
}
}
return 0;
}