基于广度优先算法BFS求无权图单源最短路径算法,c++代码全

广度优先算法可以参考文章:

https://blog.csdn.net/weixin_40283843/article/details/130882463?spm=1001.2014.3001.5501

采用BFS算法求无权图的最短路径就是在BFS遍历算法中做一些小的修改就可以,代码如下:

int d[MAX_VERTEX_NUM]; //用来记录各个顶点到原始顶点最短路径长度
int path[MAX_VERTEX_NUM]; //每个顶点在最短路径中的直接前驱
bool visited[MAX_VERTEX_NUM];//用于标记顶点是否被访问过
// 求顶点u到其他顶点的最短路径
void BFS_MIN_Disrance(Graph g, int u) 
{
	for (int i = 0; i < g->vexnum; i++) 
	{
		visited[i] = false; //初始化访问标记数组
		d[i] = MAX_LENGTH; //初始化路径长度  该顶点到原始顶点最短路径长度
		path[i] = -1; //初始化该顶点在最短路径中的直接前驱 记录
	}
	LinkQueue Q;
	InitQueue(Q); //初始化辅助队列
	int u_i = LocateVex(g, u); //找到顶点u所对应的数组下标
	d[u_i] = 0; //u是原始顶点,因此d值应该为0
	visited[u_i] = true;
	EnQueue(Q, u);
	while (!IsEmpty(Q))
	{ //BFS算法主过程
		DeQueue(Q, u); //队头元素出队并赋给u
		for (int w = FirstNeighbor(g, u); w >= 0; w = NextNeighbor(g, u, w)) {
			int w_i = LocateVex(g, w); //找到顶点w所对应的数组下标
			if (!visited[w_i]) {
				u_i = LocateVex(g, u);
				d[w_i] = d[u_i] + 1; //路径长度加1
				path[w_i] = u; //最短路径从u到w
				visited[w_i] = true; //访问标记
				EnQueue(Q, w); //顶点w入队
			}
		}
	}
}

代码中其余函数请看给出的参考文章(比如找顶点所对应的数组下标等),测试数据也与其相同,对下图进行验证(来自王道考研视频)

 其中开始顶点是2,即u = 2,运行结果如下:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值