为何BFS用queue解决是合理的
想象这个问题场景. 由于BFS要求以源节点为中心, 从近到远访问所有节点.
我们用递推证明访问顺序是从近到远的:
起初, 队列中只有一枚源节点.
当k=1时, 取出队首访问, 标记为不可再访问, 将其所有邻居加入队列. 这样会把所有距离为1的节点加入, 并标记不可再访问.
当k=2时, 依次取出队列所有节点, 对其访问并标记. 将所有可以访问的邻居加入队列并标记. 在该阶段开始时, 有这样几个性质:
- 所有距离0和1的节点都已标记不可再访问. 这样之后能加入队列的节点一定是距离2以上的.
- 每个距离1的节点都已加入队列, 都将被访问, 而每个距离2的节点都与某距离1的节点相连, 因此每个距离2的节点都将被访问. 队列中当前只有距离为1的点, 因此遍历这些点, 只会将距离为2的点加入, 而不会有其它距离的点加入.
由此类推, 可得所有距离的节点都会被访问, 且会按照距离顺序被访问.