三十一、无权最短路径排序

最短路径排序就好比我们从A城市出发到E城市办事,中间根据选择不同的路可能经过B,C,D三座城市,那么我们怎么选择出行路线能让我们以最快时间到达E城市就成了一个问题,而最短路径排序就是解决这种问题的一种方案。

其实最短路径排序,就是对整个有向图进行一次搜索,此方法也被称为广度优先搜索,类似于树的层序遍历。

这里也是提供的伪代码,注释很清晰,如有不懂请参考数据结构与算法C语言描述版。

//伪代码,无权最短路径算法的简单实现
//Table : 假设已经对无权最短路径计算的表进行初始配置
void Unweighted(Table T)
{
	//当前路径长
	int CurrDist; 
	//V : 入度结点, W : 出度结点
	Vertex V, W;
	//对所有路径长进行遍历
	for(CurrDist = 0; CurrDist < NumVertex; CurrDist++)
	{
		//对所有结点进行遍历
		for each vertex V
		{
			//如果当前结点没有进行操作,并且当前结点到顶点的路径长等于当前路径长
			if(!T[V].Known && T[V].Dist == CurrDist)
			{
				//标记已被操作
				T[V].Known = True;
				//对所有与之关联的结点进行遍历
				for each W adjacent to V
				{
					//如果当前结点到顶点的路径长为赋值
					if(T[W].Dist == Infinity)
					{
						//当前结点的路径长,等于入度结点的路径长+1
						T[W].Dist = CurrDist + 1;
						//标记一下实际入度的结点
						T[W].Path = V;
					}
				}
			}
		}
	}
}

//伪代码,无权最短路径算法的队列实现
//Table : 假设已经对无权最短路径计算的表进行初始配置
void Unweighted(Table T)
{
	//队列的声明
	Queue Q;
	//V : 入度结点, W : 出度结点
	Vertex V, W;
	//创建队列
	Q = CreateQueue(NumVertex); MakeEmpty(Q);
	//假设已知顶点,入队
	Enqueue(S, Q);

	//如果队列不为空
	while(!IsEmpty(Q))
	{
		//出队
		V = Dequeue(Q);
		//标记已操作,此步操作可有可无
		T[V].Known = True;
		//遍历与之关联的结点
		for each W adjacent to V
		{
			//如果该结点路径未赋值
			if(T[W].Dist == Infinity)
			{
				//当前结点的路径长,等于入度结点的路径长+1
				T[W].Dist = T[V].Dist + 1;
				//标记一下实际入度的结点
				T[W].Path = V;
				//入队
				Enqueue(W, Q);
			}
		}
	}

	//释放队列
	DisposeQueue(Q);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值