图算法 单源最短路径问题 无权最短路径

本文介绍了一种解决无权图最短路径问题的有效算法,通过广度优先搜索实现,时间复杂度为O(|E|+|V|)。算法使用队列辅助结构,逐步扩展距离,并记录从起始顶点到所有可达顶点的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单源最短路径问题

给定一个赋权图 G = (V, E)和一个特定顶点s作为输入,找到s到G中每一个其他顶点的最短赋权路径。

无权最短路径(解法可被用来做广度优先遍历


一个无权图G。使用某个顶点s作为输入参数,要找出从s到所有其他顶点的最短路径。

这里给出一个O( | E | + | V | )的解法。O( | V | ^2)的解法不做讨论。

对于每个顶点,跟踪三条信息,顶点是否被处理(未处理为F,处理过为T,初始为F),s到此顶点的路径长dv(s初始为0,其他为INFINITY),此顶点之前顶点

在任意时刻,只存在两种类型的dv不是INFINITY的Unknown顶点,一些顶点的dv=currDist,另一些dv=currDist+1。 一种抽象是保留两个盒子,1号盒子装有dv = currDist的那些未知顶点,而2号盒子装有dv = currDist +1的那些顶点。找出一个合适顶点的测试可以用查找1号盒内的任意顶点v代替。在更新v的临界顶点w后,将w放入2号盒中。

可以使用一个队列进一步简化上述模型。迭代开始时,队列只含有距离为currDist的顶点。当添加距离为currDist+1的那些邻接顶点时,由于它们自队尾入队,因此保证它们直到所有距离为currDist的顶点都被处理之后才处理。

//无权最短路径问题的伪代码
		void unweighted( Vertex s ){
			//一个队列
			Queue<Vertex> q = new Queue<Vertex>( );
			//每个顶点初始距离为INFINITY
			for each Vertex v
				v.dist = INFINITY;
			//s初始距离为0		
			s.dist = 0;
			q.enqueue( s );
			
			while( !q.isEmpty( ) ){
				Vertex v = q.dequeue( );
				//遍历v的邻接顶点
				for each Vertex w adjacent to v
					//如果dist是INFINITY说明没有处理过
					if( w.dist == INFINITY ){
						w.dist = v.dist + 1;
						w.path = v;
						q.enqueue( w );
					}
			}
		}
下图演示算法运行(该图还包括是否known的变化,代码中是不需要的)

以v3为开始顶点



### 使用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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值