图——六度空间问题(BFS)
首先访问1这个节点,所以这个节点的visited[V]设置为true,count用来计算一共扫过了的节点数

level是层数,一开始是1这个节点,层数为0
last用来记忆扫过的下一层的最后一个节点

流程:

  1. 让last=1(最开始的节点特殊,后面的last都是指这一层最后一个元素)
  2. 把1这个节点放入队列
  3. 当队列不空的时候,弹出队首元素
  4. 扫描和队首元素相连的节点,每个节点如果没被访问过,就把他设置成访问了的状态,然后放入队列,同时tail指向这个元素的值
  5. 当这一层扫描完的时候,tail自然就是这层最后一个元素的值
  6. 当扫描完成跳出for循环,判断第3步弹出的队首元素是否是这一层的最后一个元素和判断当前层数是否为6
  7. 如果3步弹出的队首元素不是这层最后一个元素,层数也不是6,那么就从第3步循环
  8. 当弹出的队首元素是这层最后一个元素的时候,那么下一层元素就已经存入队列,这时候层数+1,last指向下一层(存放在队列中的这层)的最后一个元素
  9. 直到层数等于6,跳出循环,返回6层一共扫描了多少个顶点元素

以题为例

  1. 首先将1这个元素的值赋值给last,count=1,然后将1放入队列

  2. 进入while循环,弹出队首元素,即1

  3. 找出和1相连的且没有被访问过的顶点元素

  4. 进入到这个顶点元素,将它的状态设置为被访问了的,然后放入队列,tail执行它。
    也就是visited[2]=true,把2放入队列,count++,tail=2
    然后到3这个元素,visited[3]=true,把3放入队列,count++,tail=3
    当这次循环结束的时候,tail肯定是7,即下一层的最后一个元素

  5. 跳出循环后,last=1,level+1,last=7,将last指向了一下次扫描的最后一个元素

  6. 弹出队首元素,v=2,将和2相邻的顶点按照之前的那种方法处理,于是将和2相关的且未被扫描过的顶点元素放入到了队列中

  7. 跳出for循环,但是v=2,last=7,即当前还不是这一层最后一个元素,重新进入到for循环中,依次处理3、4、5、6、7

  8. 当V=7时,把和7相关的元素做了相关的处理,跳出for循环。此时V=7,last=7,表示当前弹出的这个元素就是这一层的最后一个元素,所以层数可以加1了,同时将last指向下一层(队列中存放的这一层)的最后一个元素

  9. 当队列中存放第一层的时候,level是1;当第一层全部弹出,队列中存放第二层的时候level是2。也就是当level是几的时候,队列中就存放了第几层元素
    10.当level=6的时候,这时队列中存放的是第6层元素,每个元素进队列之前都会被计数此时的count就是1-6层顶点数之和。此时跳出while循环,返回count,即可得到这六层顶点元素有多少个

相关文章: