算法与数据结构(26)—— dfs的基本应用

        深度优先遍历:其实就是往一个往死里走,直到这个点不再指向其他或已经遍历过了,就退出来,接着往下一个点,直到所有的就访问过了。

        应用:求一个图的连通分量,求两个点之前的路径

dfs核心代码:
 public void dfs(int v) {
        visited[v] = true;  // 节点 i 已被访问
        for (int node : graph.adj(v)) {    // 遍历图中节点 i 的邻接节点
            if (!visited[node])     // 对未被访问的邻接节点进行 dfs
                dfs(node);
        }
    }
求连通分量:

开辟一个数组来记录属于哪个连通分量,遍历所有的节点,如果走得通就属于这个集合里,否则就是另一个连通集合里。

// 遍历所有的节点   count为连通分量个数
for(int i = 0; i < G.V(); i ++){
            if(!visited[i]){
                dfs(i);
                count++;
  }}
// 能遍历到的这个节点都属于这个连通分量里的
private void dfs(int v){
        visited[v] = true;
        id[v] = count;
        for(int i : G.adj(v)){
            if(!visited[i])
                dfs(i);
  }}

求路径的话一样:

开辟一个新的数组,每次访问的时候记录下来从哪个节点过来的。

private void dfs(int v){
        visited[v] = true;
        for(int node : G.adj(v)){
            if(!visited[node]){
                from[node] = v;    // 设置node的前一个节点为v
                dfs(node);
            }
        }
    }


你可能感兴趣的:(算法与数据结构)