Cod sursa(job #1852316)

Utilizator borcanirobertBorcani Robert borcanirobert Data 20 ianuarie 2017 18:10:07
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <vector>
using namespace std;

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

using VI = vector<int>;
VI p, l;

void Union( int x, int y );
int Find( int x );

int main()
{
    int i, N, M, t, x, y;

    fin >> N >> M;

    p = l = VI(N + 1);
    for ( i = 1; i <= N; ++i )
        p[i] = i, l[i] = 1;

    for ( i = 1; i <= M; ++i )
    {
        fin >> t >> x >> y;

        if ( t == 1 )
        {
            Union(x, y);
        }
        else
            if ( Find(x) == Find(y) )
                fout << "DA" << '\n';
            else
                fout << "NU" << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}

void Union( int x, int y )
{
    if ( l[x] < l[y] )
        p[x] = y;
    else
    {
        p[y] = x;
        if ( l[x] == l[y] )
            l[x]++;
    }
}

int Find( int x )
{
    if ( x == p[x] ) return x;
    return p[x] = Find(p[x]);
}