#include <iostream>
using namespace std;
#include <vector>
#include <queue>

using namespace std;


    // 1. Fixed the signature: Passed vis and adj by reference.
    // Renamed 'V' to 'src' to avoid confusion with the total number of vertices.
    void bfs(int src, vector<vector<int>> &adj, vector<int> &vis) {
        vis[src] = 1;
        queue<int> q;
        q.push(src);
        
        while (!q.empty()) {
            int v = q.front();
            q.pop();
            for (auto u : adj[v]) {
                if (vis[u] != 1) {
                    vis[u] = 1;
                    q.push(u);
                }
            }
        }
    }
    void dfs(int src, vector<vector<int>> &adj, vector<int> &vis){
        vis[src] = 1;
        for(auto &u : adj[src]){
            if(vis[u] != 1){
                vis[u] = 1;
                dfs(u,adj,vis);
            }
        }
    }
    
    int findNumberOfComponent(int V, vector<vector<int>> &edges) {
        // 2. Used standard vector of vectors instead of a VLA
        vector<vector<int>> adj(V);
        vector<int> vis(V, 0); 
        
        // Build the adjacency list
        for (int i = 0; i < edges.size(); i++) {
            adj[edges[i][0]].push_back(edges[i][1]);
            adj[edges[i][1]].push_back(edges[i][0]);
        }
        
        int cnt = 0;
        for (int i = 0; i < V; i++) {
            if (!vis[i]) {
                cnt++;
                dfs(i, adj, vis);
            }
        }
        
        return cnt;
    }

int main() {
  int V = 4;
    vector<vector<int>> edges = {
        {0, 1},
        {1, 2}
    };
    cout<<findNumberOfComponent(V,edges);
}