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;
}