写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!
目录
一、最短路径问题
单源最短路径——BFS算法、Dijkstra算法
其中BFS算法(无权图)、Dijkstra算法(带权图,无权图)
各顶点间的最短路径——Floyd算法(带权图、无权图)
二、BFS求无权图的单源最短路径
注:无权图可以视为一种特殊的带权图,只是每条边的权值都为1
三、代码实现
bool visited[MAX_VERTEX_NUM];//访问标记数组
//广度优先遍历
void BFS(Graph G,int v){ //从顶点v出发,广度优先遍历图G
visit(v); //访问初始顶点v
visited[v] = TRUE; //对v做已访问标记
Enqueue(Q,v); //顶点v入队列Q
while(!isEmpty(Q)){
DeQueue(Q,v); //顶点v出队列
for( w = FirstNeighbor(G,v); w >= 0; w = NextNeighbor(G,v,w))
//检测v所有邻接点
if(!visited[w]){ //w为v的尚未访问的邻接顶点
visit(w); //访问顶点w
visited[w] = TRUE; //对w做已访问标记
EnQueue(Q,w); //顶点w入队列
}//if
}//while
}
//求顶点u到其他顶点的最短路径
void BFS_Distance(Graph G,int u){
for(i = 0;i < G.vexnum;++i){
d[i] = w;
path[i] = -1;
}
d[u] = 0;
visited[u] = TRUE;
EnQueue(Q,u);
while(!isEmpty(Q)){
DeQueue(Q,u);
for(w = FirstNeighbor(G,u);w >= 0;w = NextNeighbor(G,u,w))
if(!visited[w]){
d[w] = d[u] + 1;
path[w] = u;
visited[w] = TRUE;
EnQueue(Q,w);
}//if
}//while
}
四、总结
对应的广度优先生成树为
思路就是对BFS的小修改,在visit一个顶点时,修改其最短路径长度d[]并在path[]记录前驱结点
2到8的最短路径长度=d[8]=3
通过path数组可知,2到8的最短路径为:8<- 7 <- 6 <- 2