代码示例
package DataStrcture.graphdemo;
import java.util.ArrayList;
import java.util.Arrays;
public class DFSDemo {
//测试方法
public static void main(String[] args) {
String[] str = {"A", "B", "C", "D", "E", "F", "G","H"};
DFSDemo bg = new DFSDemo(str.length);
for(String v : str){
bg.addVertex(v);
}
bg.addEdges(0, 2, 1);
bg.addEdges(0, 3, 1);
bg.addEdges(2, 3, 1);
bg.addEdges(2, 1, 1);
bg.addEdges(5, 6, 1);
bg.addEdges(5, 0, 1);
bg.addEdges(6, 4, 1);
System.out.println(" "+Arrays.toString(str));
bg.showGraph();
bg.dfsTraverse();
}
//材料
/**
* 1. 存储顶点的集合arrayList
* 2. 存储顶点之间的边信息的数组int[indexOfV1][indexOfV2] edges;
* 3. 记录边的实际数量 numOfEdges
*/
ArrayList<String> vertexs;
int[][] edges;
int numOfEdges;
boolean[] isVisited;
//构造器, 初始化
public DFSDemo(int n) {
vertexs = new ArrayList<String>(n);
edges = new int[n][n];
numOfEdges = 0;
isVisited = new boolean[n];
}
//1. 添加顶点
public void addVertex(String vertex){
vertexs.add(vertex);
}
//2.添加顶点之间的边信息
/**
* @param v1 顶点A的索引
* @param v2 顶点B的索引
* @param weight 反映两个 顶点之间是否存在边
* weight=1, 存在; weight=0, 不存在;
*/
public void addEdges(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
numOfEdges +=1;
}
public void showGraph() {
// for (int[] v : edges) {
// System.out.println(Arrays.toString(v));
// }
for(int i=0; i<edges[0].length; i++){
System.out.print((char)('A'+i)+" ");
for(int j=0; j<edges.length; j++){
System.out.print(edges[i][j]+", ");
}
System.out.println();
}
}
//dfs
/**
* 从起始节点开始进行深度优先遍历
* 不断往下查找(isVisited==false && edges[index][0->length]==1)
* isVisited[index]=true, 已经访问过, =false未访问过;
* @param index 起始节点的索引
*/
public void dfs(int index) {
System.out.print(vertexs.get(index) + "->");
isVisited[index] = true;
for (int i = 0; i < vertexs.size(); i++) {
if (!isVisited[i] && edges[index][i] == 1) {
dfs(i);
}
}
}
public void dfsTraverse() {
for (int i = 0; i < vertexs.size(); i++) {
if (!isVisited[i])
dfs(i);
}
}
}
执行结果