求结点u到其他结点的单源最短路径可以BFS广度优先遍历的方式,需要借助两个数组distance[]以及path[],前者记录到当前结点距离,后者表示路径的来源,当当前结点有未被访问的邻结点时,更新其相应的distance[]以及path[]数组即可。
void BFS_MIN_DISTANCE(Graph g,int u)
//利用BFS求u到各个结点的最短路径
{
int distance[MAX_VERTEX_NUM];//记录最短路径距离数组
int path[MAX_VERTEX_NUM];//记录路径来源数组
int visited[MAX_VERTEX_NUM];//访问数组
for(int i=0;i<g.vexnum;i++){//对数组进行初始化,-1代表到i无路径
distance[i]=-1;
path[i]=-1;
visited[i]=0;
}
InitQueue(&Q);//创建并初始化队列
visited[u]=1;//更改访问标志
distance[u]=0;//更改距离数组,0表示该点是起点
EnterQueue(&Q,u);
while(!IsEmpty(Q)){//利用队列不断更新当前结点所有未被访问邻结点的数组信息
DeleteQueue(&Q,&v);//队列非空,对头元素出队,并处理其所有未被访问邻结点
int w=FirstAdjVertex(g,v);
while(w!=-1){
if(!visited[w]){//邻结点未被访问更新访问标志、路径信息和来源信息而后入队
visited[w]=1;
distance[w]=distance[v]+1;
path[w]=v;
EnterQueue(&Q,w);
}
w=NextAdjVertex(g,v,w);//更新邻结点
}
}
}