严蔚敏视频 笔记26
深度优先搜索遍历图
从图中某个顶点v0出发,访问此顶点,然后依次从v0的各个未被访问的邻接点出发深度优先遍历图,直至图中所有和v0有路径相通的顶点都被访问到,此时若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止
void DFSTraverse(Graph G,Status (*Visit)(int v)) {
int i;
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE; // 访问标志数组初始化
for(v=0;v<G.vexnum;++v)
if(!visited[v]) DFS(G,v); // 对尚未访问的顶点调用DFS
}
void DFS(Graph G,int v) {
visited[v]=TRUE; VisitFunc(v);
for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w))
if(!visited[w]) DFS(G,w); // 对v的尚未访问的邻接顶点调用DFS
}
深度优先生成树
回边
广度优先搜索遍历图
从图中某个顶点v0出发,并在访问此顶点之后依次访问v0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和v0有路径相通的顶点都被访问到,此时若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止
void BFSTraverse(Graph G,Status (*Visit)(int v)) {
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE;
InitQueue(Q); // 置空的辅助队列Q
for(v=0;v<G.vexnum;v++)
if(!visited[v]) { // v尚未访问
EnQueue(Q,v); // v人队列
visited[v]=TRUE; Visit(u);
while(!QueueEmpty(Q)) {
DeQueue(Q,u); // 队头元素出队并置为u
for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w))
if(!visited[w]) {
EnQueue(Q,w); // u的尚未访问的邻接顶点入队列
visited[w]=True; Visit(w);
}
}
}
}