<p>You are given an array <code>routes</code> representing bus routes where <code>routes[i]</code> is a bus route that the <code>i<sup>th</sup></code> bus repeats forever.</p>

<ul>
	<li>For example, if <code>routes[0] = [1, 5, 7]</code>, this means that the <code>0<sup>th</sup></code> bus travels in the sequence <code>1 -&gt; 5 -&gt; 7 -&gt; 1 -&gt; 5 -&gt; 7 -&gt; 1 -&gt; ...</code> forever.</li>
</ul>

<p>You will start at the bus stop <code>source</code> (You are not on any bus initially), and you want to go to the bus stop <code>target</code>. You can travel between bus stops by buses only.</p>

<p>Return <em>the least number of buses you must take to travel from </em><code>source</code><em> to </em><code>target</code>. Return <code>-1</code> if it is not possible.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> routes = [[1,2,7],[3,6,7]], source = 1, target = 6
<strong>Output:</strong> 2
<strong>Explanation:</strong> The best strategy is take the first bus to the bus stop 7, then take the second bus to the bus stop 6.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
<strong>Output:</strong> -1
</pre>

<p>&nbsp;</p>

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

<ul>
	<li><code>1 &lt;= routes.length &lt;= 500</code>.</li>
	<li><code>1 &lt;= routes[i].length &lt;= 10<sup>5</sup></code></li>
	<li>All the values of <code>routes[i]</code> are <strong>unique</strong>.</li>
	<li><code>sum(routes[i].length) &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= routes[i][j] &lt; 10<sup>6</sup></code></li>
	<li><code>0 &lt;= source, target &lt; 10<sup>6</sup></code></li>
</ul>

class Solution {
    int vis[100003];
public:
    int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
        if(source==target)
        {
            return 0;
        }
      int n = routes.size();
      int m = routes[0].size();
      memset(vis,0,sizeof(vis));
      vector<int> adj[100005];
      queue<pair<int,int>> q ;
      for(int i =0 ; i<n ;i++)
      {
          for(int j =0 ; j<routes[i].size() ; j++)
          {
              adj[routes[i][j]].push_back(i);
            
          }
      }
         for (auto route : adj[source]){
            q.push({route,0});
            vis[route] = 1;
        }
        // for(auto it : adj)
        // {
        //      for(auto it1 : it)
        //      {
        //          cout<<it1<<" ";
        //      }
        //      cout<<endl;
        // }
    //   int level = 0;
    //   while(!q.empty())
    //   {
          
          
    //       while(q.size())
    //       {
             
    //           int cord = q.front().first;
    //           cout<<cord<<endl;
          
           
    //           int dis = q.front().second ;
    //            for (auto &stop: routes[cord]) {
                    
    //                 if (stop == target) {
    //                     return dis;
    //                 }
    //            }
    //           q.pop();
    //           for(auto it : adj[cord])
    //           {
                  
                   
    //                cout<<it<<" "<<vis[it]<<endl;
    //                if(vis[it]==0)
    //                {
    //                    vis[it]=1;
    //                    cout<<it<<endl;
    //                    q.push({it,dis+1});
    //                }
    //           }
              
    //       }
    //   }
    //   return -1;
     int busCount = 1;
        while (!q.empty()) {
            int size = q.size();

            while(size--) {
                int route = q.front().first;
                q.pop();

                int dis = q.front().second;
                for (auto &stop: routes[route]) {
                    
                    if (stop == target) {
                        return busCount;
                    }

                    
                    for (auto nextRoute : adj[stop]) {
                        if (!vis[nextRoute]) {
                            vis[nextRoute] = 1;
                            q.push({nextRoute,dis+1});
                        }
                    }
                }
            }
            busCount++;
        }
        return -1;

    }
};
44303