1076. Forwards on Weibo (30)

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 1010

struct Node
{
  int id;
  int layer;
};
vector<Node> G[maxn];
bool vis[maxn]={false};
int n,L,x,k,i,j,cnt=0;
Node node,temp;
//广度遍历,u为当前遍历的节点,deep为深度
void BFS(int u)
{
  queue<Node> qu;
  Node start;
  start.id = u;
  start.layer = 0;

  qu.push(start);
  vis[start.id] = true;

  while (!qu.empty())
  {
    Node front = qu.front();
    if(front.layer !=0 && front.layer <= L)
    {
      cnt++;
    }
    qu.pop();
    int s = front.id;
    for(int i=0; i<G[s].size(); i++)
    {
      Node next = G[s][i];
      next.layer = front.layer + 1;
      if(vis[next.id] == false)
      {
        qu.push(next);
        vis[next.id] = true;
      }
    }
  }

}
int main()
{
  //输入数据
  scanf("%d%d",&n,&L);
  //构造图
  for(i=1; i<=n; i++)
  {
    temp.id = i;
    temp.layer = 0;
    scanf("%d",&x);
    for(j=0; j<x; j++)
    {
      scanf("%d",&node.id);
      node.layer = 0;
      G[node.id].push_back(temp);
    }
  }
  //输入需要开始遍历的节点,并遍历和输出结果
  scanf("%d",&k);
  for(int i=0; i<k; i++)
  {
    int a;
    scanf("%d",&a);
    BFS(a);
    printf("%d\n",cnt);
    cnt = 0;
    for(int i=1; i<=n; i++)
      vis[i] = false;
      
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值