基本概念
广度优先搜索查找最短路径只是对无权图而言的。图是带权图时,把从一个顶点v0到图中其余任意一个顶点vi的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径称为最短路径。
单源最短路径
求解最短路径的算法通常都依赖于一种性质,即两点之间的最短路径也包含了路径上其他顶点间的最短路径。带权有向图G的最短路径问题一般可分为两类:一是单源最短路径,即求图中某一顶点到其他各顶点的最短路径,可通过经典的Dijkstra 算法求解;二是求每对顶点间的最短路径,可通过Floyd-Warshall算法来求解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| bool visited[MAX_VERTEX_NUM];
void BFS(Graph G, int v) { visit(v); visited[v]=TRUE; Enqueue(Q,v); while(!isEmpty(Q)) { DeQueue(Q,v); for(w=FirstNeighbor(G,v); w>=0; w=NextNeighbor(G,v,w)) { if(!visited[w]) { visit(w); visited[w]=TRUE; EnQueue(Q,w); } } } }
|
顶点到顶点
代码逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void BFS_MIN_Distance(Graph G, int u) { for(i=0; i<G.vexnum; ++i) { d[i]=∞; 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); } } } }
|