最短路径排序就好比我们从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);
}