3
vector<int> parent, rank;9
iota(begin(parent), end(parent), 0);12
int find_parent(int node) {13
if (node == parent[node]) return node;14
return parent[node] = find_parent(parent[node]);16
void Union(int u, int v) {17
int U = find_parent(u), V = find_parent(v);19
if (rank[U] < rank[V]) swap(U, V);23
int getRank(int node) {24
return rank[parent[node]];31
vector<bool> hasApple;32
vector<int> adj[100001];37
for (auto &nbr : adj[src]) {40
dp[src] = dp[src] or dp[nbr];45
int minTime(int n, vector<vector<int>> &edges, vector<bool> &hasApple) {49
this->hasApple = hasApple;51
for (auto &x : edges) adj[x[0]].push_back(x[1]), adj[x[1]].push_back(x[0]);55
for (int i = 0; i < n; ++i) {64
return (dsu.getRank(0) - 1) * 2;