DFS(深度优先算法)
1. 原理概述
最基本的DFS是用来解决无向图的遍历问题的。无向图用沿主对角线对称的邻接矩阵存储。DFS算法最基本的代码实现如下:
void dfs(int cur)//cur是当前所在的顶点编号
{
sum++;//每访问一个顶点,sum+1
if(sum==n) return;
for(i=1;i<=n;i++)//从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连
{
if(e[cur][i]==1 && book[i]==0)
{
book[i]=1;//标记顶点i已经访问过
dfs(i);//从顶点i再出发继续遍历
}
}
}
上面,cur存储当前正在遍历的顶点,二维数组e存储的是图的边(邻接矩阵),book用来记录哪些顶点已经访问过,sum用来记录已经访问过的顶点个数,n存储图中顶点的总个数。
2. 用DFS求所有可能的排列组合
以上是最基本的dfs算法实现,事实上,代码结构绝不是一成不变的。
例如,应用dfs求一串元素的所有可能的排列,抽象出来的图的分支就十分庞大。我们不关心对整张图的全部遍历,而是希望分别输出每种可能的完整排列顺序。这就需要将dfs的步骤改成:
- 定义全局的用于存放所有解的对象和存放一次解的对象。
- 在递归函数中,确定递归终止条件(一般为sum==n&