DFS与BFS

1.深度优先搜索(DFS)

       深度优先搜索类似于树的先序遍历,是树的先序遍历的推广。在图是连通的情况下,可以从图的任意v一顶点出发,访问该顶点,然后依次从v的没有被访问的邻接点进行同样的深度优先搜索。访问时需要定义一个布尔数组 visite[ i ]来记录第i个顶点是否访问过。递归和非递归代码如下:

void DFS(int i){
	visit[i] = true;    //访问顶点 i
	for (遍历i的邻接点j){
		if (!visit[j])
			DES(j);   //递归访问顶点j
	}
}
void DFS(AdjList * Graph){
	/*邻接表存储DFS非递归*/
	int i = 0,j;     
	stack<int> s;
	visit[0] = true;   //初始接点访问之
	s.push(i);    
	Enode*edge;     
	while (!s.empty()){
		i = s.top();
		s.pop(); 
		edge = Graph->Vetex[i].firstedge;
		while (edge){           
			j = edge->Advj;
			if (!visit[j]){    //将没有访问过的邻接点压入栈
				visit[j] = true;    //进栈前访问之
				s.push(j);        //进栈
			}
			edge = edge->next;
		}
	}
}


非递归算法使用栈,在进栈前访问该接点,弹出栈顶元素v,然后访问v的没有访问过的邻接点并压入栈中。直到栈为空结束遍历。使用邻接表存储时间复杂度为O(n+e),而使用邻接矩阵来存时间复杂度为O(n^2).

 2.广度优先搜索(BFS)

       广度优先搜索类似于树的层次遍历,它是树的层次遍历的推广。首先从顶点i出发访问该结点,接着依次访问v的各个邻结点。然后分别从这些邻接点出发访问它们的邻结点。实现时使用队列。链接表存储实现如下:

void BFS(AdjList * Graph){
	int i = 0,j;
	queue<int>Q;
	Enode*edge;
	Q.push(i);
	visit[i] = true;  //访问之
	while (!Q.empty()){
		i = Q.front();
		Q.pop();   //出队
		edge = Graph->Vetex[i].firstedge;
		while (edge){
			j = edge->Advj;
			if (!visit[j]){  //如果i的邻接点没有访问过就访问之并入队
				visit[j] = true;
				Q.push(j);
			}
			edge = edge->next;
		}
	}
}

非递归DFS与BFS代码完全类似,就是一个永栈一个使用队列。可以记住先访问之再如栈/队列。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值