DFS(Depth First Search)深度优先搜索,为每个顶点设立一个“访问标志”。首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行遍历。
若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之。反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕;
在使用DFS
时,可能有两种情景,一种是使用邻接矩阵
,一种是使用邻接链表
;
使用邻接矩阵
的表示形式,其实只需要一半的空间就可以了,因为edges[i][j]
和edges[j][i]
的值是相同的(这里只考虑无向图)
情景一:
给出了一个图,图中有九个顶点,分别为A~I,那么用深度遍历的方法,得到A到I的一条路径;
1 | private int number = 9; //其实是个9*9的数组; |
结果:
A B C D E F G H I
分析:通过连通图矩阵分析可知,顺序是:A->B->C->D->E->F->G->H 到了H之后走不下去了,回溯,G,F,E,D,到D的时候才有了直指I的路径;
情景二:走迷宫问题;
给出一个二维数组,用来表示一个迷宫,如果
dp[i][j]=1
则表示前是一面墙,如果是0,则表示是一条路,那么求从左上角到右下角的最短路径;
解决思路依然是使用深度优先遍历,但是要注意的是,现在的节点数不是在一维的,而是二维的,
1 | static int[][] arr = { |
要注意的是:这里使用了大量的static的全局变量path0,还有一个临时的全局变量path,临时的path是每次走时的路径,如果走到了终点,就和之前的最短路径比较,如果本次路径更短,那么就将path0设置为本次路径;
还有在遍历了一个位置之后,要把其标志位还原为false,这是因为你按照某个方向进行深度遍历下去,发现此路不通,或者不是最优解,那么你就需要按照原路回退,回退的意思就是把之前访问的flag设置为flase;同时临时路径path也要将本次访问的节点删除;