深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
因发明“深度优先搜索算法”,霍普克洛夫特与陶尔扬共同获得计算机领域的最高奖:图灵奖.
Java实现
package com.huangjin.algorithm;
import java.util.Arrays;
public class DFS {
private static int visited[];
public static void main(String[] args) {
Graph g = new Graph();
int v[] = {1,2,3,4,5};
int e[][] = {{0,1,0,0,0},{1,0,0,0,1},{0,1,0,1,0},{1,0,0,0,0},{0,0,0,0,1}};
g.setE(e);
g.setV(v);
System.out.println(g);
DFSfun(g);
}
public static void DFSTraverse(Graph g,int i)
{
System.out.println("顶点"+i+"已经被访问"+",顶点为"+g.v[i]);
visited[i]=1;//标记顶点i被访问
for(int j=0;j<g.v.length;j++)
{
if(g.e[i][j]!=0&&visited[j]==0)
DFSTraverse(g,j);
}
}
public static void DFSfun(Graph g)
{
int i;
//初始化visited数组,表示一开始所有顶点都未被访问过
visited = new int[g.v.length];
for(i=0;i<g.v.length;i++)
visited[i]=0;
//深度优先搜索
for(i=0;i<g.v.length;i++)
if(visited[i]==0)//如果这个顶点为被访问过,则从i顶点出发进行深度优先遍历
DFSTraverse(g,i);
}
}
//抽象图这种数据结构
class Graph{
int v[];//图的顶点
int e[][];//图的两条边
public int[] getV() {
return v;
}
public void setV(int[] v) {
this.v = v;
}
public int[][] getE() {
return e;
}
public void setE(int[][] e) {
this.e = e;
}
private String arraytostr(int [][] e){
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i = 0 ;i<e.length;i++){
for(int j = 0;j<e[i].length;j++){
sb.append(e[i][j]+", ");
}
}
return sb.substring(0, sb.length()-2);
}
@Override
public String toString() {
return "Grath [v=" + Arrays.toString(v) + ", e=" + arraytostr(e)+ "]";
}
}
结果:
Grath [v=[1, 2, 3, 4, 5], e=[0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1]
顶点0已经被访问,顶点为1
顶点1已经被访问,顶点为2
顶点4已经被访问,顶点为5
顶点2已经被访问,顶点为3
顶点3已经被访问,顶点为4