Untitled

 avatar
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