ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归遍历二维数组,图的邻接矩阵,深度优先搜索dfs

2021-01-30 13:02:50  阅读:200  来源: 互联网

标签:遍历 int graph dfs addEdge 邻接矩阵 visited public


一.递归遍历二维数组,即深度优先搜索

  主要是向右,向下搜索

public class DFSTest1 {

    public static void main(String[] args) {
        int[][] a1 = new int[][]{
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
        };
        int row = a1.length;
        int col = a1[0].length;

        boolean[][] visited = new boolean[row][col];
        dfs(a1,0,0,visited);

    }

    private static void dfs(int[][] nums,int x,int y,boolean[][] visited){
        int row = nums.length;
        int col = nums[0].length;
        if(x>=row){
            return;
        }
        if(y>=col){
            return;
        }
        if(visited[x][y]){
            return;
        }
        System.out.print(nums[x][y] +",");
        visited[x][y] = true;

        dfs(nums,x+1,y,visited);
        dfs(nums,x,y+1,visited);
    }
}

 

输出:  1,5,9,10,11,12,6,7,8,2,3,4,

 

搜索方向如下图所示:

 

 

二.递归遍历图,基于邻接矩阵,即深度优先搜索

 

//无向无权图
public class Graph {
    //顶点数量
    private int vertexNum;
    //边的数量
    private int edgeNum;
    //邻接矩阵
    private int[][] adjustMatrix;

    public Graph(int v){
        vertexNum = v;
        adjustMatrix = new int[v][v];
    }

    public boolean addEdge(int begin,int end){
        if(begin<0||begin>=vertexNum||end<0||end>=vertexNum){
            return false;
        }
        adjustMatrix[begin][end] = 1;
        adjustMatrix[end][begin] = 1;
        edgeNum++;
        return true;
    }

    public void dfs(int start, Set<Integer> visited){
        System.out.println(start);
        visited.add(start);
        for (int i = 0; i < vertexNum; i++) {
            if(!visited.contains(i) && adjustMatrix[start][i]==1){
                dfs(i,visited);
            }
        }
    }
}

 

public class GraphTest {
    public static void main(String[] args) {
        Graph graph = new Graph(5);
        graph.addEdge(0,1);
        graph.addEdge(0,2);
        graph.addEdge(0,3);
        graph.addEdge(2,3);
        graph.addEdge(2,4);
        graph.addEdge(1,4);
        Set<Integer> visited = new HashSet<>();
        graph.dfs(0,visited);
    }
}

输出:

0
1
4
2
3

                  图结构                                                          邻接矩阵

 

 

 

搜索过程 ,和邻接表的搜索过程类似

 

 1.从 顶点0开始,即第0行开始搜索

 2.搜索到第一个为 1 的,输出1,然后去 第1行搜索

 3.搜索到第4个为1,输出4,去第4行查找,与4顶点相连的元素,发现没有了。

 4 .从第0行 ,第2个元素开始查找,输出2,去第2行找,找到3,输出3,去第3行找与3顶点相连的顶点

     发现没有了,即不满足条件,结束。

 

标签:遍历,int,graph,dfs,addEdge,邻接矩阵,visited,public
来源: https://www.cnblogs.com/arxobject/p/14348722.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有