一、前言:
该题与六度空间类似,只不过将六度空间里的六层改为一个变量L。
二、解读题意:
很少有接触英文题,还看了我一段时间,只要还是根据数据来猜
输入:
1、第一行是N,总共结点(下标从0-N-1),然后是L(代表最多可以查到的层数)
2、接下来是N行,每行是0-N-1的结点的连接情况,先是一个该结点总的连接点数,之后是与该点连接的点。
3、最后一行为要输出的点的连接数量,先是一个总数,再写出点
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
输出:
输出以最后一行为标准的点,所连接的点的个数
4
5
三、关键点:
1、该图是一个有向图,所以要先自己定个方向,比方说且题目给出的0-N-1行数据里的点,定为该点->列出的点,比方说
3 2 3 4
为下标为0的点指向2,3,4这些点。之后看最后一行
2 2 6
让我们求2这个点,我们要找的不是2指向的点,而是所有指向2的点开始找。
2、之后就是跟六度空间一样的操作,以下链接有详细说明
代码:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
int g[1010][1010];
int n, l;
int visited[1010];
typedef struct queue *Queue;
struct queue{
int *q;
int front, rear;
};
Queue creatqueue(int size)
{
Queue Q = (Queue)malloc(sizeof(struct queue));
Q->q = (int *)malloc(sizeof(int)*size);
Q->front = -1;
Q->rear = -1;
return Q;
}
void Enqueue(Queue Q, int x)
{
Q->q[++Q->rear] = x;
}
int Dequeue(Queue Q)
{
return Q->q[++Q->front];
}
int isEmpty(Queue Q)
{
if (Q->front == Q->rear)
return 1;
else
return 0;
}
int BFS(int x)
{
visited[x] = 1;
int last = x;
int tail = 0;
int count = 0;
int level = 0;
Queue Q;
Q = creatqueue(1100);
Enqueue(Q, x);
while (!isEmpty(Q))
{
int v = Dequeue(Q);
for (int i=1; i<=n; i++)
{
if (!visited[i]&&g[i][v])
{
visited[i] = 1;
Enqueue(Q, i);
tail = i;
count++;
}
}
if (last == v)
{
last = tail;
level++;
}
if (level == l)
break;
}
return count;
}
int main()
{
scanf("%d%d", &n, &l);
for (int i=1; i<=n; i++)
{
int c;
scanf("%d", &c);
for (int j=1; j<=c; j++)
{
int x;
scanf("%d", &x);
g[i][x] = 1;
}
}
int ci;
scanf("%d", &ci);
for (int i=1; i<=ci; i++)
{
int x;
scanf("%d", &x);
memset(visited, 0, sizeof(visited));
printf("%d\n", BFS(x));
}
return 0;
}