797 所有可能的路径

Posted by LemonWhale on June 23, 2024

题目

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

解法分析

  • 使用图的深度优先(dfs)搜索进行题解
  • 图的存储形式:邻接矩阵和邻接表

邻接矩阵

// 1. 创建一个 n×n 的二维数组,全部元素初始化为0
vector<vector<int>> graph(n, vector<int>(n, 0));

// 2. 输入 m 个边
while(m--){
	cin >> s >> t;
	// 使用邻接矩阵,1 表示节点 s 指向节点 t
	graph[s][t] = 1;
}

邻接表

// 1. 构造一个数组,数组中的元素需要是列表
// 有 n 个节点,所以大小需要为 n
vector<list<int>> graph(n);
// 2. 输入 m 个边
while(m--){
	cin >> s >> t;
	// 使用邻接表,表示 s 和 t 是相连的
	graph[s].push_back(t);
}

C语言写法

// 深度优先搜索 dfs
class Solution {
public:

    vector<vector<int>> result;  // 存储所有路径
    vector<int> path; // 存储单个可能的路径

    void dfs(const vector<vector<int>> &graph, int x, int n){
        if(x == n) {
            result.push_back(path);
            return;
        }
        for(auto &i : graph[x]){
                path.push_back(i);  // 将当前节点加入路径
                dfs(graph, i, n);  // 递归
                path.pop_back();  // 回溯当前节点     
        }
    }

    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0);
        cout << graph.size() << endl;
        // 注意是size - 1 ,因为从 0 开始
        dfs(graph, 0, graph.size() - 1);   
        return result;       
    }
};