## 图的DFS深度遍历

``````package com.qey.learn;

import java.util.ArrayList;
import java.util.Arrays;

/**
* @ClassName graph
* @Description
* @Author qianxl
* @Date 2021-03-06 17:18
* @Version 1.1
**/
public class Graph {
private int [][] edges;
private ArrayList<String>  vertexList;
private  int numOfEdges=0;
private  boolean []isVisited;
public Graph(int n){
edges =new int[n][n];
vertexList =new ArrayList<String>(n);
isVisited=new boolean[n];
}

public static void main(String[] args) {
Graph graph = new Graph(5);
//初始化
String[]  array={"A","B","C","D","E"};
for(int i=0;i<array.length;i++){
}
System.out.println(graph.vertexList.toString());
// A-B A-C   B-C  B-D  B-E
graph.inertEdges(0,1,1);
graph.inertEdges(0,2,1);
graph.inertEdges(1,2,1);
graph.inertEdges(1,3,1);
graph.inertEdges(1,4,1);
graph.showGraph();

graph.dfs();

}

public void inertEdges(int v1,int v2,int weigh){
edges[v1][v2]=weigh;
edges[v2][v1]=weigh;
numOfEdges++;
}

public int getNumOfEdges() {
return numOfEdges;
}
//获取顶点
public String getVertex(int index){
return vertexList.get(index);
}
//获取边
public  int getEdges(int v1,int v2){
return  edges[v1][v2];
}
//输出邻接矩阵
public void showGraph(){
for(int[] line:edges){
System.out.println(Arrays.toString(line));
}
}

//获取第一个邻接点
public int getNeighbor(int index){
for(int j=0;j<vertexList.size();j++){
if(edges[index][j]>0){
return  j;
}
}
return  -1;
}
//获取当前邻接点的下一个邻接点
public int getNeighbor(int v1,int v2){
for(int j=v2+1;j<vertexList.size();j++){
if(edges[v1][j]>0){
return  j;
}
}
return  -1;
}

/**
*
* [0, 1, 1, 0, 0]
* [1, 0, 1, 1, 1]
* [1, 1, 0, 0, 0]
* [0, 1, 0, 0, 0]
* [0, 1, 0, 0, 0]
* @param v
*/
//dfs 第一轮
public  void  dfs(boolean [] isVisited,int v){

System.out.print(getVertex(v)+"->");

isVisited[v]=true;
int w = getNeighbor(v);
while(w!=-1){
if(!isVisited[w]){
dfs(isVisited,w);
}
w=getNeighbor(v,w);
}

}

public void dfs(){
for(int i=0;i<numOfEdges;i++){
if(!isVisited[i]){
dfs(isVisited,i);
}

}
}

}
``````