宽度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。在图论和计算机科学中,BFS是从根节点开始,沿着树的宽度优先遍历树的节点。它会先访问最近的节点,然后逐渐扩展到更远的节点,类似于水平方向的搜索。在图的环境中,BFS通常用于寻找两个节点之间的最短路径,尤其是在无权图中,可以找到最短的路径。
在这个例子中,我们有一个从城市A到城市H的交通图,目标是找到一条经过城市数量最少的路线。这个问题可以转化为一个图的遍历问题,每个城市作为一个节点,两城市间的可达性作为边。BFS在这种情况下特别适合,因为它会首先访问距离起点最近的节点。
具体实现BFS的步骤如下:
1. 初始化:将起始城市A加入队列,并创建一个数据结构(如记录类型r)来存储节点信息,包括当前城市(city)和前驱节点(pre)。同时,用一个集合(s)来标记已访问过的城市,防止重复访问。
2. 循环:在每次循环中,首先将队首元素(当前最接近起点的城市)出队,然后检查其相邻的所有城市。如果相邻的城市未被访问过(不在集合s中),则将其入队,并更新其前驱节点(指向当前队首城市),同时将其添加到已访问集合中。
3. 终止条件:当目标城市H入队时,搜索结束。此时,通过记录中的pre数组可以回溯并打印出从A到H的最短路径。
参考程序中定义了一个邻接矩阵ju来表示图,其中0表示两个城市间有道路连接,1表示无连接。类型r定义了记录结构,包含city数组记录城市名,pre数组记录前驱节点。主程序从doit开始,执行BFS过程。out过程用于输出找到的最短路径。
在提供的程序中,队列的操作通过变量h和d实现,h表示当前队首位置,d表示队尾位置。当h等于d时,表示队列为空,即所有可访问的城市都被检查过。在for循环中,程序遍历矩阵ju,查找与队首城市相邻且未访问过的城市,符合条件的城市加入队列。当找到目标城市H时,调用out过程打印路径。
最终输出的路径是H-F--A,表明从城市A到城市H的最短路径是A->F->H。这个程序展示了BFS算法在解决最短路径问题中的应用。