<p>Given a directed acyclic graph (<strong>DAG</strong>) of <code>n</code> nodes labeled from <code>0</code> to <code>n - 1</code>, find all possible paths from node <code>0</code> to node <code>n - 1</code> and return them in <strong>any order</strong>.</p>

<p>The graph is given as follows: <code>graph[i]</code> is a list of all nodes you can visit from node <code>i</code> (i.e., there is a directed edge from node <code>i</code> to node <code>graph[i][j]</code>).</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/09/28/all_1.jpg" style="width: 242px; height: 242px;" />
<pre>
<strong>Input:</strong> graph = [[1,2],[3],[3],[]]
<strong>Output:</strong> [[0,1,3],[0,2,3]]
<strong>Explanation:</strong> There are two paths: 0 -&gt; 1 -&gt; 3 and 0 -&gt; 2 -&gt; 3.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/09/28/all_2.jpg" style="width: 423px; height: 301px;" />
<pre>
<strong>Input:</strong> graph = [[4,3,1],[3,2,4],[3],[4],[]]
<strong>Output:</strong> [[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>n == graph.length</code></li>
	<li><code>2 &lt;= n &lt;= 15</code></li>
	<li><code>0 &lt;= graph[i][j] &lt; n</code></li>
	<li><code>graph[i][j] != i</code> (i.e., there will be no self-loops).</li>
	<li>All the elements of <code>graph[i]</code> are <strong>unique</strong>.</li>
	<li>The input graph is <strong>guaranteed</strong> to be a <strong>DAG</strong>.</li>
</ul>

class Solution {
public:
    vector<int> dfs(int s,unordered_map<int,vector<int>>&adj,vector<int>&v,vector<int>&visited)
    {
        visited[s]=true;
        v.push_back(s);        
            for(auto vec:adj[s])
            {
                dfs(vec,adj,v,visited);
                
            }
            return v;
        
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        unordered_map<int,vector<int>>adj;
       // vector<vector<int>>ans;
        for(int i=0;i<graph.size();i++)
        {
            for(int j=0;j<graph[i].size();j++)
            {
               adj[i].push_back(graph[i][j]);
            }
           
        }
       
       
        /*for(int i=0;i<graph.size();i++)
        {
            vector<int>visited(graph.size(),false);
            vector<int>v;  
            ans[i]=dfs(0,adj,v,visited);
        }
       // dfs(0,n,adj,ans,v,visited);
        return ans;
        */
        int n=graph.size();
        queue<vector<int>>q;
        q.push({0});
        vector<vector<int>>ans;
        vector<int>v;
        //v.push_back(0);
        while(!q.empty())
        {
         v=q.front();
            q.pop();
            int t=v.back();
           // v.push_back();
            if(t==n-1)
                {
                    ans.push_back(v);
                }
            for(int i:adj[t])
            {
                vector<int>a=v;
                a.push_back(i);
                q.push(a);
               
            }
        }
return ans;
    }
};
20641