DFS与BFS

南昌理工ACM集训队

DFS
深搜,顾名思义,是深入其中、直取结果的一种搜索方法。

在这里插入图片描述

深度优先搜索的过程类似于树的前遍历,从深度优先搜索的例子开始。例如图1为无路图,采用深度优先算法遍历图的过程为:

  1. 首先,任意查找一个尚未遍历的顶点,例如从V1开始,因为V1先被访问,所以V1的状态需要标记为已访问;

  2. 然后遍历V1的相邻点,比如访问V2并对其进行标记,再访问V2的相邻点,比如V4(标记),然后是V8,然后是V5;

3.当您继续遍历V5的相邻点时,将根据前面创建的标记访问所有相邻点。在这一点上,从V5回到V8看看V8是否有一个未对冲的邻居,如果没有,继续V4 V2 V1;

  1. 通过查看V1,你可以找到一个未开发的顶点V3,继续遍历,然后访问V3相邻的点V6,然后是V7;

  2. 由于V7没有未标注的相邻点,所以全部退回到V6,继续退回到V3,最后到达V1,发现没有未标注的相邻点;

  3. 最后一步需要确定是否访问了所有顶点,如果没有访问,继续以未完成的顶点作为第一个顶点遍历顶部。

根据以上过程,可以得到深度优先级搜索得到的顶点遍历顺序如图1所示:

V1 - V2 - V4 - V8 - V5 - V3 - V6 - V7。

所谓深度优先搜索是指图中的某个顶点每次都要遍历当前访问的顶点的临界点,直到被访问的顶点没有未涉足的临界点为止。然后,反过来,看看道路上的每个顶点是否有其他未对齐的临界点。当访问完成时,确定是否遍历了图中的顶点,如果没有遍历,以访问内的顶点作为起始点重复此过程。

深搜优缺点
优点
1、能找出所有解决方案
2、优先搜索一棵子树,然后是另一棵,所以和广搜对比,有着内存需要相对较少的优点
缺点
1、要多次遍历,搜索所有可能路径,标识做了之后还要取消。
2、在深度很大的情况下效率不高

模板

void DFS() //N代表目前DFS的深度
{
	if(找到解) //进行相应的操作
	{return;
	}
	for(inti=0;i<4;i++) //枚举四个方向
	{
    	DFS(N+1); //进入下层递归
	}
}

BFS
广搜,顾名思义,是多管齐下、广撒网的一种搜索方法
无向图
广度优先搜索类似于树的层次遍历。从图中的一个顶点开始,遍历每个顶点,依次遍历它的所有邻居,然后从这些邻居开始,依次访问它们的邻居。按照这个步骤,直到图中被访问顶点的所有相邻点都被访问为止。

您需要做的最后一件事是查看图表中是否有尚未访问的顶点,如果是,以该顶点作为起点重复遍历过程。

将没有办法图在图1中,例如,假设V1是起点,遍历所有的相邻点V2和V3, V2为起点,访问邻点V4和V5, V3为起点,V4作为起点,V5的起点,起点的V5以来访问,和所有V6和V7中直接访问。

在以V1为起点的遍历过程结束时,确定图中是否还有未删除的点,由于图1中没有剩余的点,所以整个遍历结束。遍历顶点的顺序为:

V1 - V2 - v3 - V4 - V5 - V6 - V7 - V8。
广搜优缺点
优点
1、对于解决最短或最少问题特别有效,而且寻找深度小
2、每个结点只访问一遍,结点总是以最短路径被访问,所以第二次路径确定不会比第一次短
缺点
1、内存耗费量大(需要开大量的数组单元用来存储状态)

模板

void BFS() 
{ 	… …//初始化起点入队 
	while(!q.empty()) //判断队是否为空
	{	… …//获取队首元素
		if(...){… …}//判断是否是终点
		for(int i=0;i<4;i++)//四个方向
		{ 
			k.x=p.x+dir[i][0];
	    	k.y=p.y+dir[i][1];
			//向各个方向走一步
	     	if(judge())//判断能不能走
			{
		    	… …//各种处理 
    		    vis[k.x][k.y]=1; //标记 	
	        	q.push(k); //入队
			}
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值