Untitled
unknown
plain_text
24 days ago
1.3 kB
8
Indexable
#include <bits/stdc++.h> using namespace std; int dsu_find(vector<int> &parent, int node) { if (parent[node] == -1) return node; int tmp = dsu_find(parent, parent[node]); parent[node] = tmp; return tmp; } void dsu_union(vector<int> &parent, vector<int> &group_size, int u, int v) { int par_u = dsu_find(parent, u); int par_v = dsu_find(parent, v); if (par_u == par_v) return; if (group_size[par_u] >= group_size[par_v]) { group_size[par_u] += group_size[par_v]; parent[par_v] = par_u; } else { group_size[par_v] += group_size[par_u]; parent[par_u] = par_v; } } int main() { int v, e; cin >> v >> e; vector<int> parent(v + 1, -1); vector<int> group_size(v + 1, 1); int components = v, largest_comp = 1; while (e--) { int u, v; cin >> u >> v; int par_u = dsu_find(parent, u); int par_v = dsu_find(parent, v); if (par_u != par_v) { components--; } dsu_union(parent, group_size, u, v); // size of largest components int curr_comp_size = max(group_size[par_u], group_size[par_v]); largest_comp = max(largest_comp, curr_comp_size); cout << components << " " << largest_comp << endl; } return 0; }
Editor is loading...
Leave a Comment