class Solution { public int numBusesToDestination(int[][] routes, int source, int target) { /* Q8 graph playlist , make a hashmap of busstops - busses , busvisited , busStop visited . first add all busStops -> busses in hashmap add source bus to q and fire bfs with a level variable in 2 while loops take out bus from busstops in HM and add all busStops which can be reached from that busStop , as they can all reach with 1 bus only , mark bus and bus stop visited and increase level return level when target busStop is reachedd */ //making a HM of busstops -> busno. HashMap<Integer,ArrayList<Integer>> map = new HashMap<>(); //adding bustops -> busno. for(int i =0 ; i< routes.length ; i++){ for(int j = 0 ; j < routes[i].length ; j++){ ArrayList<Integer> temp = map.getOrDefault(routes[i][j] , new ArrayList<>()); temp.add(i); map.put(routes[i][j] , temp); } } LinkedList<Integer> q = new LinkedList<>(); HashSet<Integer> busVisited = new HashSet<>(); HashSet<Integer> busStopVisited = new HashSet<>(); int level = 0; //adding source busStop to Q q.addLast(source); while(q.size() > 0){ int size = q.size(); while(size-- > 0){ //getting busses corresponding to bus stop int rem = q.pop(); if(rem == target) return level; ArrayList<Integer> busses = map.get(rem); //looping over all the busses which can be taken from the current busStop for(int bus : busses){ //only if the bus is not visited if(busVisited.contains(bus) == false){ int [] busStops = routes[bus]; //getting busStops which can be reached for current bus for(int busStoops : busStops){ //only if the busStop is not visited if(busStopVisited.contains(busStoops) == false){ q.addLast(busStoops); busStopVisited.add(busStoops); //marking visited } } busVisited.add(bus); //marking visited } } } level++; } return - 1; } }