无权图单源最短路径问题

一 概述

无权图:即表示图中的边是没有权重的,或者是所有的边权重为同一个正数。

单源:以一个顶点为初始顶点出发,求解该顶点到其他顶点的最短路径。

最短路径:定义从顶点u到顶点v的最短路径d(u,v)为从u到v的任何路径中边数最少的路径。如果从某一顶点u到顶点v没有通路时,则d(u,v) = ∞。

二 无权图单源最短路径问题求解过程

先看一个问题:找到从顶点1到顶点5的路径

直观的可以发现图中的路径有1-2-5和1-2-4-5两条路径。其中最短路径为1-2-5。

根据广度优先算法中遍历的都是与初始结点较近的结点,所以可以利用这个性质来进行最短路径的查找。

无权图单源最短路径问题的重要代码:

void BFS_MIN_Distance(Graph G,int u){
	for(int i = 0; i < G.vexnum; ++i){
        d[i] = MAX;//将初始顶到其他顶点之间的路径设置为MAX,即表示没有路径
    }
	//将改顶点在辅助标记数组中的值设置为TRUE,表示该顶点已经被访问且入队
	visited[u] = TRUE;
    d[u] = 0;//表示初始顶点到初始顶点的值0
	//将该顶点入队
	EnQueue(Q,u);
	while(!isEmpty(Q)){
		//出队队首元素,并将其赋值到v当中
		Dequeue(Q,u);
		//找到所有符合要求的邻接顶点
		//FirstNeighbor求某个顶点的第一个邻接顶点,当此时的w为-1表示无邻接顶点,当w>0成立时,该w为邻接顶点的编号
		//NextNeighbor求某个顶点的其他邻接顶点。
		for(w = FirstNeighbor(G,u);w >= 0;w = NextNeighbor(G,u,w))
			if(!visited[w]){
				//将当被访问过的顶点标记为访问过
				visited[w] = TRUE;
                d[w] = d[u] + 1;//初始顶点到顶点w的最短路径,u到顶点的路径长度d[u]加上其到顶点w的一条边,即为最短路径
				//将该顶点入队
				EnQueue(Q,w);
			}//if
	}//while
}

上述即为利用广度优先搜索算法的性质解决无权图单源最短路径的问题。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值