797. All Paths From Source to Target**
https://leetcode.com/problems/all-paths-from-source-to-target/
题目描述
Given a directed, acyclic graph of N
nodes. Find all possible paths from node 0
to node N-1
, and return them in any order.
The graph is given as follows: the nodes are 0, 1, ..., graph.length - 1
. graph[i]
is a list of all nodes j
for which the edge (i, j)
exists.
Example:
Input: [[1,2], [3], [3], []]
Output: [[0,1,3],[0,2,3]]
Explanation: The graph looks like this:
0--->1
| |
v v
2--->3
There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.
Note:
- The number of nodes in the graph will be in the range
[2, 15]
. - You can print different paths in any order, but you should keep the order of nodes inside one path.
C++ 实现 1
使用 DFS + Backtracing. 由于 Graph 是有向无环图, 可以不用考虑已经访问 neighbors 会有自己的问题. 由于 path 的目标是从 0 -> N - 1
的所有路径, 起始点始终是 0, 而终点始终是 N - 1
, 因此只有当 path.back() == N - 1
时, 才将结果加入到 res
中.
class Solution {
private:
void dfs(const vector<vector<int>> &graph,
int node,
vector<int> &path, vector<vector<int>> &res) {
if (path.back() == graph.size() - 1) {
res.push_back(path);
return;
}
auto neighbors = graph[node];
for (auto &n : neighbors) {
path.push_back(n);
dfs(graph, n, path, res);
path.pop_back();
}
}
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
vector<int> path{0};
vector<vector<int>> res;
dfs(graph, 0, path, res);
return res;
}
};