思路:该题跟六度空间十分相似,使用广度优先遍历,难点是确定层数,是在每层用tail变量记录每层最后一个结点,如果当前结点与tail相等说明该层已经遍历完。
#include<iostream>
#include<queue>
#define MaxNum 1001
using namespace std;
int N, L, K;
int Map[MaxNum][MaxNum],visited[MaxNum];
void BFS(int target) {
queue<int> q;
int count = 0,last=target,level=0,tail=0;
visited[target] = 1;
q.push(target);
while (!q.empty()) {
int node = q.front();
q.pop();
for (int i = 1; i <= N; i++) {
if (Map[node][i] != 0&&visited[i]==0) {
q.push(i);
visited[i] = 1;
count++;
tail = i;
}
}
if (node==last) {
level++;
last = tail;
}
if (level == L) {
break;
}
}
cout << count << endl;
}
void init() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
Map[i][j] = 0;
}
}
}
void init_visited() {
for (int i = 1; i <= N; i++) {
visited[i] = 0;
}
}
int main()
{
cin >> N >> L;
int next_node,target_num,target;
init();
for (int i = 1; i <=N; i++) {
cin >> next_node;
for (int j = 0; j < next_node; j++) {
int node;
cin >> node;
Map[node][i] = 1;
}
}
cin >> target_num;
for (int i = 0; i < target_num; i++) {
cin >> target;
BFS(target);
init_visited();
}
return 0;
}