Cod sursa(job #3247534)

Utilizator ilincaSSirbu Ilinca Maria ilincaS Data 8 octombrie 2024 11:01:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,m,cod,x,y;
struct DSU{

    vector<int> parent,sizes;
    void init(int N)
    {
        parent.resize(n+1);
        sizes.resize(n+1,1);
        for(int i=1;i<=n;i++)
            parent[i]=i;
    }

    int Find(int u)
    {
        if(u==parent[u])
            return u;

        return Find(parent[u]);
    }

    void unite(int u,int v)
    {
        u=Find(u);
        v=Find(v);
        if(u==v)
            return;

        if(sizes[v]>sizes[u])
            swap(u,v);
        parent[v]=u;
        sizes[u]+=sizes[v];
    }
};
int main()
{
    DSU dsu;
    fin >> n >> m;
    dsu.init(n);
    for(int i=1;i<=m;i++)
    {
        fin >> cod >> x >> y;
        if(cod==1)
        {
            dsu.unite(x,y);
        }
        else
        {
            if(dsu.Find(x)==dsu.Find(y))
                fout << "DA" << '\n';
            else
                fout << "NU" << '\n';
        }
    }
    return 0;
}