数据结构(九)——最短路径问题

本文介绍了数据结构中的最短路径问题,包括单源最短路径的BFS和Dijkstra算法,以及每对顶点间最短路径的Floyd算法。BFS适用于无权图,Dijkstra适用于有权图但不处理负权,Floyd通过动态规划找出所有顶点间的最短路径。

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

  • 带权路径长度:任意一对顶点间所需要经过的边的权值和。
  • 最短路径:带权路径长度最短的一条边。

最短路径问题一般可以分为两类,每一类都有经典的算法求解:

  • 单源最短路径:BFS(无权)、Dijkstra(有权+无权)。
  • 每对顶点间的最短路径:Floyd(有权+无权+负值)。

1. 单元最短路径问题

1.1 BFS

(1)算法思路
对于无权图,可以通过一次BFS遍历就可以获得指定初始顶点的单源最短路径。同时相比于普通的BFS算法,需要另外维护d[N]和path[N]两个数组,用于保存与初始顶点间的最短路径以及在最短路径上的前缀顶点。

  1. 初始化数组d[N]和path[N]。
  2. 指定初始顶点并将对应最短距离设置为0.
  3. 层次遍历算法,在将邻近顶点加入队列前更新对应的距离和前缀数组。
#define INT_MAX 3fffffff
void BFS_MIN_DISTANCE(Gragh G, int v) {
   
	// 初始化距离和前缀数组
	for(int i=0; i<Gragh.vexnum; i++) {
   
		v[i] = INT_MAX;
		path[i] = -1;
	}
	// 更新初始顶点
	d[v] = 0;
	visited[v] = true;
	Q.push(v);
	// BFS
	while(!Q.empty()) {
   
		v = Q.pop();
		for(w=FirstNeibor(G,v);w>=0;w=NextNeighbor(G,v,w)) {
   
			
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冠long馨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值