完整代码示例-Java实现图的深度优先遍历(DFS)

代码示例


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);
        }
    }
}


执行结果

在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(88)  评论(0编辑  收藏  举报