797. All Paths From Source to Target的C++解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/82703967

相当于图的深度优先遍历和广度优先遍历。我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的不太好写,还没找到写得比较好的。

猜你喜欢

转载自blog.csdn.net/musechipin/article/details/82703967