Untitled
unknown
plain_text
8 months ago
1.3 kB
11
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