BFS算法求无权图最短路径问题

目录

一、前言

二、BFS求某个顶点到其他顶点的最短路径

三、完整代码

四、代码中所创建的图

五、运行结果


一、前言

        前一篇文章我们详细讲了BFS的原理及实现,在使用BFS遍历图的过程中,我们可以对每个顶点进行标记,标记当前顶点距离源头顶点的距离。这个距离我们用int d[i]来存储,由于BFS的性质,d[i]中存放的就是源头顶点v到顶点i的最短路径。

二、BFS求某个顶点到其他顶点的最短路径

bool visited[MAX_VERTICES];         //用于标记顶点是否被访问过,访问过为true
queue<int> q;                       //C++STL中的队列,创建一个辅助队列

int d[MAX_VERTICES];                //d[i]表示从顶点v到顶点i的最短路径
void BFS_MIN_Distance(Graph graph,int v) {
    //d[i]表示从顶点v到顶点i的最短路径
    for (int i = 0; i < graph.num_vertices; i++) {
        d[i] = INT_MAX;             //初始化路径长度为无穷大
    }
    visited[v] = true;              //标记为已访问
    d[v] = 0;                       //顶点v到自身的距离为0
    q.push(v);                      //入队
    while (!q.empty()) {            //当队列不为空时
        int QueueHead = q.front();  //获取当前处于队头的顶点
        q.pop();                    //获取队头后然后再出队
        Edge* p = FirstNeighbor(graph, QueueHead);  //得到上面获取的队头的指向第一条边的指针
        //这层循环将访问与QueueHead关联的所有顶点
        while (p != NULL) {         //p不为空说明QueueHead有关联的边
            int w = p->adjVertex;   //w是与v关联的顶点下标
            if (!visited[w]) {      //未访问
                visited[w] = true;  //标记为已访问
### 使用BFS算法实现单源最短路径计算 #### 算法原理 广度优先搜索(BFS)适用于无权图中的单源最短路径问题,在这种情况下,每条边的权重相同。通过逐层遍历节点的方式找到从起点到其他各点的最短距离[^1]。 #### 实现思路 为了利用BFS来寻找最短路径,需要维护两个辅助数据结构: - **队列**:用于存储待处理的顶点。 - **距离数组**:记录从起始顶点到达各个顶点所需的最小步数。 当访问一个新的顶点时,更新其对应的最短距离并将其加入队列等待进一步探索相邻顶点。如果遇到已经访问过的顶点,则跳过该操作因为此时不可能存在更优解。 #### Python代码示例 下面是一个简单的Python版本的BFS实现,用来解决无向无权图上的单源最短路径问题: ```python from collections import deque, defaultdict def bfs_shortest_path(graph, start_vertex): visited = set() # 记录已访问的节点集合 distance = {start_vertex: 0} # 初始化距离字典 queue = deque([start_vertex]) # 创建双端队列并将初始顶点入队 while queue: current_vertex = queue.popleft() if current_vertex not in visited: neighbors = graph[current_vertex] for neighbor in neighbors: if neighbor not in distance.keys(): distance[neighbor] = distance[current_vertex] + 1 queue.append(neighbor) visited.add(current_vertex) return distance if __name__ == "__main__": g = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': [], 'D': [], 'E': [] } result = bfs_shortest_path(g, "A") print(result) ``` 此程序定义了一个`bfs_shortest_path()`函数接收图形表示以及起始顶点作为参数,并返回一个包含所有可抵达顶点及其对应最短路径长度的结果字典[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想学习啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值