深搜广搜概念

广度优先搜索(BFS)
目的是系统地展开并检查图中的所有节点,它不考虑结果的可能位置,彻底地遍历整张图,直到找到结果为止。类似树的按层遍历,其过程为:首先访问初始点Vi,并将其标记为已访问过,接着访问Vi的所有未被访问过可到达的邻接点Vi1、Vi2……Vit,并均标记为已访问过,然后再按照Vi1、Vi2……Vit的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依此类推,直到图中所有和初始点Vi有路径相通的顶点都被访问过为止。
广度优先搜索使用队列(queue)来实现
伪代码

BFS(顶点v)
{
	
  	v点入队
	while(队列不为空)
  	{
		取队首点v,并把该点出队
		for(对于每一个邻接该点且未标记遍历的点u)
		{
			if(符合题目条件)
			{
				标记u点;
				u点入队;
			}
		}
	}
	return 结果
}

广搜:搜索过程没有回溯,是一种牺牲空间换取时间的方法。

深度优先搜索(DFS)

深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用递归或者栈来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换基本完成了问题求解。
在深度优先搜索的过程当中,往往有很多走不通的“死路”。假如我们把这些“死路”排除在外,不是可以节省很多的时间吗?打一个比方,前面有一个路径,别人已经提示:“这是死路,肯定不通”,而你的程序仍然很“执着”地要继续朝这个方向走,走到头来才发现,别人的提示是正确的。这样,浪费了很多的时间。针对这种情况,我们可以把“死路”给标记一下不走,就可以得到更高的搜索效率。
递归实现代码思路:

DFS(顶点v)
{
	if(满足答案条件)
	{
		记录或更改
		return
	}
  	for(对于每一个邻接v且未标记遍历的点u)
	{
		if(剪枝)
		{
			标记v为已遍历;
			 DFS(u);
			恢复标记;
		}
	}
}
发布了24 篇原创文章 · 获赞 5 · 访问量 1706

猜你喜欢

转载自blog.csdn.net/weixin_44091157/article/details/90724119
今日推荐