Cod sursa(job #2061218)

Utilizator nic_irinaChitu Irina nic_irina Data 8 noiembrie 2017 23:30:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
using namespace std;

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

struct forest{
    int p;
    int rankk;
}v[100001];

void make_set( int x )
{
    v[x].p = x;
}

int find_set ( int x )
{
    if ( x != v[x].p )
        v[x].p = find_set( v[x].p );
    return v[x].p;
}

void link ( int x, int y )
{
    if ( v[x].rankk > v[y].rankk )
        v[y].p = x;
    else
        if( v[x].rankk < v[y].rankk )
            v[x].p = y;
        else{
            v[y].p = x;
            v[x].rankk++;
        }
}

void unite ( int x, int y )
{
    link( find_set(x), find_set(y) );
}

int main()
{
    int n, m, i, cod, x, y;
    fin>>n>>m;

    for( i = 1; i <= n; i++ ) {
        make_set(i);
    }

    for ( i = 1; i <= m; i++ ) {
        fin >> cod >> x >> y;
        if ( cod == 1 ) {
            unite ( x, y );
        }
        else {
            if ( find_set(x) == find_set(y) )
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
    }

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