#include <stack>
#include <vector>
 
class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        std::stack<int> s;
        // Lookups
        std::vector<bool> visited(rooms.size(), false);
        std::vector<bool> inStack(rooms.size(), false);
 
        int totalVisited = 0;
 
        inStack[0] = true;
 
        s.push(0);
 
        while (!s.empty()) {
            int currentRoom = s.top();
            s.pop();
 
            visited[currentRoom] = true;
            totalVisited++;
 
            for (int i = 0; i < rooms[currentRoom].size(); i++) {
                if (!inStack[rooms[currentRoom][i]] && !visited[rooms[currentRoom][i]]) {
                    s.push(rooms[currentRoom][i]);
                    inStack[rooms[currentRoom][i]] = true;
                }
            }
        }
 
        return (totalVisited == rooms.size());
    }
};