圖論系列(二)——圖的深度優先遍歷

1. 樹的深度優先遍歷與圖的深度優先遍歷對比

在這裏插入圖片描述

2. 代碼實現(遞歸版)

import java.util.ArrayList;

public class GraphDFS {

    private Graph G;
    private boolean[] visited;
    private ArrayList<Integer> order = new ArrayList<>();

    GraphDFS(Graph G){
        this.G = G;
        visited = new boolean[G.V()];

        //解決非連通圖的遍歷問題
        for (int v = 0; v < G.V(); v++) {
            if(!visited[v])
                dfs(v);
        }
        //dfs(0);
    }

    private void dfs(int v){
        visited[v] = true;
        order.add(v);

        for(int w:G.adj(v)){
            if(!visited[w])
                dfs(w);
        }
    }

    public Iterable<Integer> order(){
        return order;
    }

    public static void main(String[] args) {
        
        Graph g = new Graph("g_3.txt");
        GraphDFS graphDFS = new GraphDFS(g);
  
        System.out.println(graphDFS.order());

    }
}

在這裏插入圖片描述

時間複雜度:O(V+E)

3. 代碼實現(非遞歸版)

import java.util.ArrayList;
import java.util.Stack;

public class GraphDFS_non_recursion {

    private Graph G;
    private boolean[] visited;
    private ArrayList<Integer> order = new ArrayList<>();

    GraphDFS_non_recursion(Graph G){
        this.G = G;
        visited = new boolean[G.V()];

        //解決非連通圖的遍歷問題
        for (int v = 0; v < G.V(); v++) {
            if(!visited[v])
                dfs(v);
        }
        //dfs(0);
    }

    private void dfs(int v){
        Stack<Integer> stack = new Stack<>();
        stack.push(v);
        visited[v] = true;

        while(!stack.empty()){
            int cur = stack.pop();
            order.add(cur);
            for(int w:G.adj(cur)){
                if(!visited[w]){
                    stack.push(w);
                    visited[w] = true;
                }
            }
        }
    }

    public Iterable<Integer> order(){
        return order;
    }

    public static void main(String[] args) {

        Graph g = new Graph("g_3.txt");
        GraphDFS_non_recursion graphDFSnr = new GraphDFS_non_recursion(g);
        System.out.println(graphDFSnr.order());
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章