有向無環圖-dfs-797所有可能的路徑

給你一個有 n 個節點的 有向無環圖(DAG),請你找出所有從節點 0 到節點 n-1 的路徑並輸出(不要求按特定順序)

graph[i] 是一個從節點 i 可以訪問的所有節點的列表(即從節點 i 到節點 graph[i][j]存在一條有向邊)。

示例 1:

輸入:graph = [[1,2],[3],[3],[]]
輸出:[[0,1,3],[0,2,3]]
解釋:有兩條路徑 0 -> 1 -> 3 和 0 -> 2 -> 3
示例 2:

輸入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
輸出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
提示:

n == graph.length
2 <= n <= 15
0 <= graph[i][j] < n
graph[i][j] != i(即不存在自環)
graph[i] 中的所有元素 互不相同
保證輸入爲 有向無環圖(DAG)
Related Topics

👍 409, 👎 0bug 反饋 | 使用指南 | 更多配套插件
通知:數據結構精品課 已更新到 V2.1,手把手刷二叉樹系列課程 上線,第 20 期打卡挑戰 即將開始,最後 1 天報名!

⭐️labuladong 題解

labuladong 思路
基本思路
本文有視頻版:圖論基礎及遍歷算法

解法很簡單,以 0 爲起點遍歷圖,同時記錄遍歷過的路徑,當遍歷到終點時將路徑記錄下來即可。

既然輸入的圖是無環的,我們就不需要 visited 數組輔助了,可以直接套用 圖的遍歷框架。

詳細題解:圖論基礎及遍歷算法

標籤:圖論算法,數據結構

思路:dfs回溯


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    // 記錄所有路徑

    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        List<List<Integer>> resList = new LinkedList<>();
        dfs(resList, new ArrayList(), graph, 0, graph.length);
        return resList;
    }

    /* 圖的遍歷框架 */
    void dfs(List<List<Integer>> resList, ArrayList<Integer> res, int[][] graph, int i, int n) {
        if (i == n - 1) {
            res.add(i);
            resList.add(new ArrayList<>(res));
            res.remove(res.size() - 1);
            return;
        }

        res.add(i);
        for (int next : graph[i]) {
            dfs(resList, res, graph, next, n);
        }

        res.remove(res.size() - 1);

    }
}

//leetcode submit region end(Prohibit modification and deletion)

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