DFS
深
度优先遍历又被称为深度优先搜索 ( Depth First
Search, DFS )
访问策略: 从图中某一起始顶点 v 出发,访问它的任
一邻接顶点 w1;再从 w1 出发,访问与 w1邻接且还没
有访问过的任一顶点 w2;… 如此进行下去,直至到
达所有的邻接顶点都被访问过的顶点。此时,回溯到
上一个被访问的顶点,看它是否还有其它没被访问的
邻接顶点。若有,则访问该邻接顶点,进行与前述类
似的访问;若没有,进一步回溯.
深度优先搜索树
将节点按照访问顺序打上标记并连接起来就构成深度优先搜索树。
递归版
DFS1[初始化]
visit( v ); //可以是输出、操作等
visited[v] = 1;
DFS2[深度优先遍历]
for( p = Head[v] -> adjacent ; p ; p = p -> link )
if (visited[ p -> VerAdj ] != 1 )
DepthFirstSearch (p -> VerAdj);
非递归版
for( i=1 ; i<=n ; i++ ) visited[i] = 0;
CREATESTACK(S) ;
S.push(v). visited[v]=1.
NRDFS2. [用S 深度优先遍历]
while ( ! S.empty()){
v = S.pop();
cout<<v;
for( p=Head[v]->adjacent ;p ; p = p -> link )
if(visited [ p ->VerAdj] ==0 ) {
S.push( p->VerAdj); visited[v]=1;}
}//入栈就打上标记
邻接矩阵时间效率O(n),邻接链表时间效率O(n+e).
BFS
广度优先遍历又称为广度优先搜索
(Breadth First Search, BFS )
访问策略:首先访问初始点顶点
v0
,之后依次访问与 v0邻接的全部顶点
w1
,
w2
,
...
,
wk
。然后,再顺次 访问与w1
,
w2
,
...
,
wk
邻接的尚未访问的全部顶点, 再从这些被访问过的顶点出发,逐个访问与它们邻接 的尚未访问过的全部顶点。依此类推,直到连通图中的所有顶点全部访问完为止。
算法BFS (v)
/*连通分支的广度优先遍历算法 */
BFS1[初始化]
for ( i =1 ; i <= n ; i++ ) visited[i] = 0;
CREATQuene Q; Q.insert(v); visited[v] = 1;
BFS2[广度优先遍历]
while(! Q.empty()) { /* 当队列不空时 */
v=Q.delete(); /* 出队 */
cout<<v;
for ( p = Head[v]->adjacent ; p ; p = p->link ) .
if ( visited [ p -> VerAdj ] == 0 ){
Q.insert ( p -> VerAdj) ; visited[p -> VerAdj] = 1;
}▐
邻接矩阵时间效率O(n),邻接链表时间效率O(n+e).