图的DFS和BFS遍历

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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值