------------恢复内容开始------------
深度优先搜索DFS
一、简介
二、算法思想
优先访问最后一个被访问的顶点的未被访问的相邻结点(递归)
DFS在访问图中某一 起始顶点v后,由v出发,访问它的任一邻接顶点w1;
再从w1出发,访问与w1邻接但还没有访问过的顶点w2;然后再从w2出发,进行类似的访问,...
如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止。
接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。
■如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
■如果没有,就再退回-步进行搜索。
■重复上述过程,直到连通图中所有顶点都被访问过为止。
图示过程:(遍历过程不唯一)
遍历序列:A->D->F->H->I->C->B->E
三、伪代码
1 void DFS(Graph* G,int v)//从图的某个顶点开始遍历 2 { 3 Previsit(G,v); 4 G->SetMark(v,VISIT);//设置访问标记 5 for(int w=G->first(v);w<G->n();w=G->next(v,w)) 6 { 7 if(G->GetMark(w)==UNVISIT) 8 {//如果没有被访问过,则访问v的临界顶点 9 DFS(G,w); 10 } 11 } 12 Postvisit(G,v); 13 }
四、应用实例
广度优先搜索BFS
一、简介
二、算法思想
优先访问一个顶点的全部相邻结点(层次遍历)
在访问了起始顶点v之后,依次访问v的各个未曾被访问过的邻接顶点w1, w2, ... w,,然后再顺序访问w1, w2, ...w,的所有还未被访问过的邻接顶点。如此做下去,直到
图中所有顶点都被访问到为止。
图示过程:
遍历序列:A->B->C->D->E->F->H->I
三、伪代码
1 void BFS(Graph* G,int v,queue<int>* Q)//从图的某个顶点开始遍历 2 { 3 int v,w; 4 Q->enqueue(v);//入队列 5 G->SetMark(v,VISIT);//设置访问标记 6 while(Q->length()!=0) 7 { 8 v=Q->dequeue();//出队列,开始遍历 9 Previsit(G,v); 10 for(int w=G->first(v);w<G->n();w=G->next(v,w)) 11 { 12 if(G->GetMark(w)==UNVISIT) 13 { 14 G->SetMark(w,VISIT); 15 Q->enqueue(w); 16 } 17 } 18 Postvisit(G,v); 19 } 20 }
四、应用实例
DFS VS BFS
未完
------------恢复内容结束------------