給你一個有 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)