【数据结构】图的遍历--广度优先搜索

本文详细介绍了广度优先搜索算法的基本原理与实现过程,通过队列保证访问次序,从起始点开始逐层访问图中的节点,适用于连通与非连通图。并给出了基于邻接矩阵存储结构的具体实现代码。

广度优先搜索过程类似于树的层次遍历,假设从图中某顶点i出发,在访问i之后依次访问i的各个未被访问的邻接点,然后从这些邻接点出发依次访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到所有顶点都被访问到(限于连通图)。如果是非连通图,则从未被访问的顶点中任选一个,再次重复上述过程。
换句话说,广度优先搜索过程中其实是以顶点i为起始点,由近及远,依次访问了与i路径相通且路径长度为1,2,··· ···的顶点。
根据广度优先搜索的特点,可以使用队列来保证访问的次序。每访问一个顶点就将该顶点入队,之后从队首取出一个顶点,依次访问该顶点未被访问过的邻接点,并入队。重复该过程,直到队列为空,则一个连通分量的遍历完成。

    以该无向图为例,以A为起点,字母序访问邻接点,其广度优先搜索结果为:
                         A B C D F H E G I

下面给出邻接矩阵存储图的广度优先搜索算法的代码描述。

void BFS_M(MGraph G)
{
    Queue Q;
    int t;
    Q = CreateQ();
    for(int i = 0; i < G->n; i++)
        G->Visited[i] = 0;
    for(int i = 0; i < G->n; i++){
        if(!G->Visited[i]){
            printf("%c ", G->Vertices[i]);
            G->Visited[i] = 1;
            AddQ(Q,i);
            while(!IsEmptyQ(Q)){
                t = DeleteQ(Q);
                for(int j = 0; j < G->n; j++)
                if(G->Edges[t][j] != INFINITY && !G->Visited[j]){
                    printf("%c ", G->Vertices[j]);
                    G->Visited[j] = 1;
                    AddQ(Q,j);
                }
            }
        }
        printf("\n");
    }
}
### 广度优先搜索遍历算法解释 广度优先搜索(Breadth First Search, BFS)是一种用于遍历或搜索中节点的算法。该方法按照层次顺序访问所有节点,即先访问起始节点,再依次访问其相邻的所有未被访问过的邻居节点,然后再访问这些邻居的邻居,以此类推直到所有的可达节点都被访问完毕[^1]。 对于每一个新发现的节点,将其标记为已访问并加入队列;当处理到某个节点时,则从队列移除之。通过这种方式可以确保每个节点仅会被处理一次,并且能够找到最短路径上的边数最少的一条路经到达目标节点[^2]。 #### Python 实现代码如下: ```python from collections import deque def bfs(graph, start): visited = set() # 记录已经访问过的顶点集合 queue = deque([start]) # 初始化队列为起点 while queue: vertex = queue.popleft() if vertex not in visited: print(f'Visiting {vertex}') visited.add(vertex) # 将当前顶点连接但尚未访问过的新邻接点入队 for neighbor in graph[vertex]: if neighbor not in visited: queue.append(neighbor) # 定义无向数据结构表示法 graph_example = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph_example, 'A') ``` 此段程序定义了一个简单的函数`bfs()`来执行广度优先搜索操作。给定一个由字典形式描述的和一个起始顶点作为输入参数,在控制台打印出按层序访问各个顶点的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值