赞
踩
深度优先搜索(Depth-First Search,DFS)是十分常见的图搜索方法之一。深度优先搜索会沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。深度优先遍历按照深度优先搜索的方式对图进行遍历。并且每个节点只能访问一次。
深搜优先搜索的本质上就是持续搜索,遍历了所有可能的情况,必然能得到解。DFS搜索的流程是一个树的形式,每次一条路走到黑。
深搜优先搜索最早是使用在开发爬虫早期使用较多的方法。它的目的主要是达到被搜索结构的叶结点:即那些不包含任何超链的HTML文件)。沿着HTML目录层级下探,直到最后一层,然后回退到上层,被访问过的节点会被标记,然后查看是否有其他节点,如果有则继续下突然,直到最后一层。一次类推直到所有节点都被查找。
深度优先遍历的秘籍:后访问的节点,其邻接点先被访问。根据深度优先遍历的秘籍,后来的先服务,这可以借助“栈”来实现。递归本身就是使用“栈”实现的,因此使用递归的方法更方便。
深度优先遍历图的方法是,从图中某顶点v出发:
1、访问顶点v;
2、依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
3、若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
初始化图中的所有节点为均未被访问。
从图中的某个节点v出发,访问v并标记其已被访问。
依次检查v的所有邻接点w,如果w未被访问,则从w出发进行深度优先遍历(递归调用,重复步骤(2)和(3))。
应用最多的其实是数字的排列
给定一个整数a,输出一个a位数,总共有多少种方法?
输入格式:
输入一个整数a。
输出格式:
输出所有排列方案,每个方案占一行。
数据范围:
1≤a≤10
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
我们通过图来展示一下怎么查找的:
描述:
如图,首先会一路下探到然后回退到_ 发现没法继续,又回退到_ _ 然后一路下探到之后回退、下探……循环往复。知道最后回退到头。
代码实现:
int path[A];
bool st[A];
void dss(int u )
{
if(u==n)//如果遍历到底了就输出
{
for(int i = 0; i < n ; i++)
cout<<path[i]<<" ";
cout<<endl;
return;//回到上一层
}
//当u<n时,说明还没填完。
for(int i = 1 ; i<= n ;i ++)
{
if(!st[i])//如果这层i没有被用过。
{
path[u] = i;//u深度赋值为i
st[i] = true;//标记i已近被用过。
dss(u + 1);//进入下一层
st[i] = false;//回溯时候要把i重新回到未标记的状态,不用恢复path[u] = 0是因为它会被覆盖
//然后继续循环
//循环完了后依然会回到上一层
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。