算法:图的深度优先搜索

Posted 小白学算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:图的深度优先搜索相关的知识,希望对你有一定的参考价值。

1
算法描述


从图中s点出发,并将这个点标记为已访问



找到s的一个相邻点v,将这个点v标记为已访问



找v的相邻点w,如果w存在且未被标记,就将w标记为已访问,如果w点不存在,就返回v点,再找v的另一相邻点



直到图中所有点都被标记为已访问为止



对于上图,我们可以采用邻接矩阵来表示,构建一个5x5的矩阵

跟顶点0相邻的顶点有2,3,4,所以在矩阵中[0,2],[0,3],[0,4]都用T标记

2
算法实现
public class Graph {
    public int V;//顶点数
    public int E;//边的个数
    public boolean[][] adj;//邻接矩阵

    //以顶点数为参数的构造函数
    public Graph(int V) {
        this.V = V;
        this.E = 0;
        adj = new boolean[V][V];//初始化邻接矩阵
    }

    //添加以v,w为顶点的边
    public void addEdge(int v, int w) {
        adj[v][w] = true;
    }
}


public class DepthFirstSearch {
    private boolean[] visited;

    //g是要搜索的图,s是要访问的顶点
    public DepthFirstSearch(Graph g, int s) {
        visited = new boolean[g.V];
        dfs(g, s);
    }

    private void dfs(Graph g, int s) {
        visited[s] = true;
        System.out.print(s + " ");
        for (int v = 0; v < g.V; v++) {
            if (!visited[v] && g.adj[s][v]) {
                dfs(g, v);
            }
        }
    }
}


public class Main {
    public static void main(String[] args){
        Graph graph = new Graph(6);
        graph.addEdge(02);
        graph.addEdge(03);
        graph.addEdge(25);
        graph.addEdge(53);
        graph.addEdge(04);
        graph.addEdge(15);
        graph.addEdge(31);
        graph.addEdge(41);
        new DepthFirstSearch(graph, 0);

    }
}
3
算法分析

     其实用邻接矩阵表示图并不是最好的选择,如果一个图顶点个数很多,那么邻接矩阵将会占很大的空间,即使我们这里用的是布尔类型。其实可以采用邻接表数组来表示图,使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表

     上面的简单代码只能判断连通图,对于非连通图还应该遍历所有顶点确保每个顶点都被标记为已访问




以上是关于算法:图的深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

算法|图的遍历-深度优先搜索(DFS)

图的广度、深度优先搜索和拓扑排序

手撸golang 基本数据结构与算法 图的搜索 深度优先/广度优先

C语言实现图的广度优先搜索遍历算法

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)