#include <iostream>
#include <vector>
#include <string.h>
#define Max 1010
using namespace std;
vector<int> Graph[Max]; //用邻接表存储图
int queue[Max],front,rear; //队列
int visit[Max],total;
int n,lever;
typedef struct Node
{
int num;
int level;
}Node;
Node node[Max];
void BFS( int start )
{
node[++rear].num = start; //开始节点进队
node[rear].level = 0;
while( front != rear )
{
Node temp = node[++front]; //对首元素出队
visit[temp.num] = 1;
// cout<<"temp.num为"<<temp.num<<endl; //置访问标志位
for( int i=0;i<Graph[temp.num].size();++i )
{
int key = Graph[temp.num][i];
// cout<<"key为:"<<key<<endl;
if( visit[key] == 0 && temp.level<lever ) //如果未被访问,并且层次数小于等于lever
{
node[++rear].num = key;
node[rear].level = temp.level+1;
visit[key] = 1;
total++;
// cout<<"total is:"<<total<<endl;
}
}
}
}
int main ()
{
cin>>n>>lever;
for( int i=1;i<=n;++i )
{
int m,user;
cin>>m;
for( int j=1;j<=m;++j )
{
cin>>user;
Graph[user].push_back(i);
}
}
//查看邻接表
// for( int i=1;i<=n;++i )
// {
// cout<<"第"<<i<<"个用户的关注者:";
// for( int j=0;j<Graph[i].size();++j )
// {
// if( j == Graph[i].size()-1 )
// cout<<Graph[i][j]<<endl;
// else
// cout<<Graph[i][j]<<" ";
// }
// }
int k,key;
cin>>k;
for( int i=1;i<=k;++i)
{
cin>>key;
//查询之前的初始化操作
memset(visit,0,sizeof(visit));
front = rear = -1;
total = 0;
level = 0;
BFS(key);
//输出转发总数
cout<<total<<endl;
}
return 0;
}
提交情况:
先前把题意理解错了,导致只有部分正确。原因是在某一层上的节点都要检查,不只是检查某一个(有点记不得了,应该是理解这样了)。