<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:
    def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
        adj = collections.defaultdict(list)
        n = len(graph)
        for i,neiList in enumerate(graph):
            adj[i].extend(neiList)
        print(adj)
        
        res = []
        curPath = []

        def dfs(node, curPath):
            if node == n-1:
                res.append(curPath.copy())
                return
            for nei in adj[node]:
                curPath.append(nei)
                print("---------------")
                dfs(nei, curPath)
                curPath.remove(nei)
            return
            
#        dfs(0,[0])
#        print(res)
#        return res
        q = collections.deque()
        q.append([0])
        print(q)
        visit = set()
        def bfs():
            while q:
                for i in range(len(q)):
                    curPath = q.popleft()
                    print(curPath)
                    lastnode =curPath[-1]
                    visit.add(lastnode)
                    # examine each neighbor of this lastnode which hasnt been visited earlier
                    if lastnode == n-1:
                        res.append(curPath.copy())
                    else:
                        for nei in adj[lastnode]:
                            #if nei not in visit:
                                #print(type(curPath))
                                curPath.append(nei)
                                #print(curPath)
                                q.append(curPath)
                                curPath = curPath[:-1]
        bfs()
        print(res)
        return res

18100