#include <stack>
#include <vector>
 
class Solution {
public:
    int findCircleNum(std::vector<std::vector<int>>& isConnected) {
        std::stack<int> toVisit;
        std::vector<bool> visited(isConnected.size(), false);
        int province = 0;
 
        for (int city = 0; city < isConnected.size(); city++) {
            if (visited[city]) continue;
            province++;
 
            toVisit.push(city);
 
            while (!toVisit.empty()) {
                int c = toVisit.top();
                toVisit.pop();
 
                visited[c] = true;
 
                for (int nc = 0; nc < isConnected[c].size(); nc++) {
                    if (!visited[nc] && nc != c && isConnected[c][nc] == 1) toVisit.push(nc);
                }
            }
        }
 
        return province;
    }
};