使用深度優先搜索查找路徑


給定圖G及起點s,查找從s到其他頂點的路徑。

 

 

設計一個類實現該算法,類的API如下:

 

 

基於深度優先搜索實現路徑查找,該算法擴展深度優先搜索,在原算法的基礎上添加一個實例變量edgeTo[],這個數組用於記錄每個與s連通的頂點回到s的路徑。

 如下圖:

edgeTo[]的值為:

節點1與2(數組下標表示節點)存儲的為0,表示由節點1或2可以到節點0,節點3存儲的為2,表明節點3可以到節點2 。那么由節點0到節點3的路徑為0-2-3。

 

實現代碼如下:

public class DepthFirstPaths {

    private int s;
    private boolean[] marked;
    private int[] edgeTo;

    public DepthFirstPaths(Graph G, int s) {
        this.s = s;
        marked = new boolean[G.V()];
        edgeTo = new int[G.V()];
        dfs(G, s);
    }

    private void dfs(Graph G, int v) {
        marked[v] = true;
        for (int w:G.adj(v)) {
            if (!marked[w]) {
                edgeTo[w] = v;
                dfs(G, w);
            }
        }
    }

    public boolean hasPathTo(int v) {
        return marked[v];
    }


    public Iterable<Integer> pathTo(int v) {
        if (!marked[v]) return null;
        Stack<Integer> path = new Stack<>();
        for (int x = v; x != s; x = edgeTo[x])
            path.push(x);
        path.push(s);
        return path;
    }

}

 

 

示例:

如下圖,使用深度優先搜索查找G中頂點0到其他頂點路徑的過程及結果

 

    public static void main(String[] args) {

        Graph G = new Graph(6);
        G.addEdge(0, 5);
        G.addEdge(0, 1);
        G.addEdge(0, 2);
        G.addEdge(2, 4);
        G.addEdge(2, 3);
        G.addEdge(2, 1);
        G.addEdge(3, 4);
        G.addEdge(3, 5);

        DepthFirstPaths paths = new DepthFirstPaths(G, 0);
        for (int x:paths.pathTo(5))
            System.out.print(x + " ");
        System.out.println();

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM