#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; }
时间: 2024-10-13 02:31:03