Cod sursa(job #2315606)

Utilizator natrovanCeval Marius natrovan Data 10 ianuarie 2019 12:13:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

class QuickUnionUF
{
private:
    int id[100005];
    int sz[100005];
    int root(int i)
    {
        while(i != id[i])
        {
            i = id[i];
            id[i] = id[id[i]];
        }
        return i;
    }

public:
    QuickUnionUF(int N)
    {
        for(int i=0;i<N;++i)
        {
            id[i]=i;
            sz[i]=1;
        }
    }

    bool connected(int p, int q)
    {
        return root(p)==root(q);
    }

    void unite(int p, int q)
    {
        int i = root(p);
        int j = root(q);
        //id[i] = j;
        if (i == j) return;
        if (sz[i] < sz[j])
        {
            id[i] = j;
            sz[j] += sz[i];
        }
            else
                {
                    id[j] = i;
                    sz[i] += sz[j];
                }
    }

};

int a,b,c,N,M,i;

int main()
{
    fin>>N>>M;
    QuickUnionUF sir=QuickUnionUF(N);
    cout<<"FU";
    //sir.QuickUnionUF(N);

    for(i=0;i<M;++i)
    {
        fin>>c>>a>>b;
        if(c==1){
            sir.unite(a,b);
        }
        else{
            if(sir.connected(a,b))fout<<"DA"<<'\n';
                else fout<<"NU"<<'\n';
        }
    }


    return 0;
}