PAT:1076. Forwards on Weibo (30) AC

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int MAX=1010;

bool tag[MAX];    //标记BFS是是否被访问过

struct node
{
  int ID;      //编号
  int layer;    //层号
};

vector<node> Adj[MAX];  //邻接表,每个位置都是一个node
queue<node> q;      //BFS待查询队列

int BFS(int s,int l)    //起始点s,极限传播层数l
{
  int transNum=0;      //转发次数
  node start;
  start.ID=s;
  start.layer=0;
  q.push(start);
  tag[s]=1;
  while(!q.empty())
  {
    node tmp=q.front();
    q.pop();
    int u=tmp.ID;
    for(int i=0 ; i<Adj[u].size() ; ++i)    //处理此编号的邻接节点
    {
      node next=Adj[u][i];          //【skill】可以直接用二维数组
      next.layer=tmp.layer+1;
      if(tag[next.ID]==0 && next.layer<=l)  //未被访问而且在传播范围之内
      {
        ++transNum;
        tag[next.ID]=1;            //符合的才进的来,在这里改标记
        q.push(next);
      }
    }
  }
  return transNum;
}

int main()
{
  int n,lev;
  node user;
  scanf("%d%d",&n,&lev);
  for(int i=1 ; i<=n ; ++i)        //建立邻接表
  {
    user.ID=i;
    int followNum;
    scanf("%d",&followNum);
    for(int j=0 ; j<followNum ; ++j)
    {
      int f;
      scanf("%d",&f);
      Adj[f].push_back(user);      //【caution】看清题意:f号可以转发给编号为i的用户user
    }
  }
  int k;
  scanf("%d",&k);
  for(int t=0 ; t<k ; ++t)
  {
    int query;
    scanf("%d",&query);
    memset(tag,0,sizeof(tag));
    printf("%d\n",BFS(query,lev));
  }
  return 0;
}
posted on 2015-03-07 03:37  Evence  阅读(180)  评论(0编辑  收藏  举报