Cod sursa(job #1847439)

Utilizator abccnuCamelia Zalum abccnu Data 14 ianuarie 2017 17:05:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");

const int NMAX=100003;

int n , m, rang[NMAX], rad[NMAX];

void unite (int x, int y)
{
    if (rang[x]>rang[y])rad[y]=x;
    else rad[x]=y;

    if (rang[x]==rang[y])rang[y]++;

}

int  findd (int x)
{
    int i, y;
     for (i = x; rad[i] != i; i = rad[i]);

    while (rad[x] != x)
    {
        y = rad[x];
        rad[x] = i;
        x = y;
    }
    return i;
}


int main()
{
    int type, x, y;
    fin>>n>>m;
    for ( int i=1; i<=n; ++i)
    {
        rad[i]=i;
        rang[i]=1;
    }

    for (int i=1; i<=m; ++i)
    {
        fin>>type;
        if (type==1)
        {
            fin>>x>>y;
            if (findd(x)!=findd(y))unite(findd(x), findd(y));
        }
        else
        {
            fin>>x>>y;
            if (findd(x)==findd(y)) fout<<"DA"<<"\n";
            else fout<<"NU"<<"\n";
        }
    }

    return 0;
}