相当于图的深度优先遍历和广度优先遍历。我AC的代码是深度优先的。要注意的是,因为用了一个全局变量path记录当前路径,所以回退的时候要手动pop一下。
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
int n = graph.size()-1;
tryaroad(0, n, graph);
return res;
}
void tryaroad(int f, int r, vector<vector<int>>& graph)
{
if (f == r)
{
path.push_back(r);
res.push_back(path);
}
else
{
path.push_back(f);
for (int i = 0; i < graph[f].size(); i++)
{
tryaroad(graph[f][i], r, graph);
path.pop_back();
}
}
}
};
速度比较慢,但是看到一个beat100%的跟我写得差不多,唯一的不同是把res和path放在了实参列表里传递:
class Solution {
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph)
{
vector<vector<int>> rt;
vector<int> vc={0};
dfs( vc, rt, graph);
return rt;
}
void dfs( vector<int>& vc, vector<vector<int>>& rt, vector<vector<int>>& graph)
{
if(vc.back()==graph.size()-1)
{
rt.push_back(vc);
return ;
}
for( int j=0; j<graph[vc.back()].size(); j++)
{
vc.push_back(graph[vc.back()][j]);
dfs( vc, rt, graph);
vc.pop_back();
}
return ;
}
};
BFS的不太好写,还没找到写得比较好的。