从起始顶点出发,先访问所有直接相邻顶点,再依次访问这些邻接点的未访问邻接点,逐层扩展。
| 特性 | BFS | DFS |
|---|---|---|
| 数据结构 | 队列 | 栈(递归栈) |
| 策略 | 逐层扩展 | 尽可能深 |
| 无权最短路径 | ✓ | ✗ |
| 空间 | O(|V|) | O(|V|) |
存储影响:邻接矩阵实现 BFS O(|V|²);邻接表实现 O(|V| + |E|)。
BFS_Visit(G, v):
1. 访问 v,visited[v]=true,v 入队 Q
2. 当 Q 非空:
2.1 队头 u 出队
2.2 对 u 的每个邻接点 w:
若 w 未被访问:访问 w、标记、w 入队
层次性:第 0 层起始点,第 1 层其所有邻接点……第 k 层为距离起点恰好 k 条边的顶点。BFS 生成树:w 首次被访问时使之入队的边 (u,w) 即树边。
邻接表版 BFS(主流程 + 求最短路径只需把 dist 赋值替代 visit):
void BFS_AL(ALGraph G, int v){
Queue Q; InitQueue(&Q);
visit(v); visited[v]=true; EnQueue(&Q, v);
while(!IsEmpty(&Q)){
int u=DeQueue(&Q);
for(ArcNode *p=G.vertices[u].firstarc; p; p=p->nextarc)
if(!visited[p->adjvex]){
visit(p->adjvex);
visited[p->adjvex]=true;
EnQueue(&Q, p->adjvex);
}
}
}
广度优先求无权图最短路径:dist[] 初值 -1(不可达),起点的 dist=0;访问邻接点时 dist[w]=dist[u]+1。BFS 生成树第 k 层的顶点恰是 dist=k 的顶点。
顶点集 $V=\{0,1,2,3,4,5\}$,边集 $E=\{(0,1),(0,2),(1,3),(1,4),(2,4),(3,5),(4,5)\}$,从顶点 0 开始:
队列演进: [0] → [1,2] → [2,3,4] → [3,4] → [4,5] → [5] → []
BFS 序: 0 → 1 → 2 → 3 → 4 → 5
层次: 第 0 层 {0}、第 1 层 {1,2}、第 2 层 {3,4}、第 3 层 {5}
dist: dist[0]=0, dist[1]=1, dist[2]=1, dist[3]=2, dist[4]=2, dist[5]=3
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。