Cod sursa(job #1170331)

Utilizator vlad.florescu94FMI Florescu Vlad - Adrian vlad.florescu94 Data 13 aprilie 2014 11:49:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
#define NMAX 100002

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int tata[NMAX],rang[NMAX],n,m,i;

int findRoot(int x)
{
    int root,aux;

    root=x;
    while(tata[root]!=root)
        root=tata[root];

    while(x!=root)
    {
        aux=tata[x];
        tata[x]=root;
        x=aux;
    }
    return root;
}

void unite(int x,int y)
{
    int root1=findRoot(x), root2=findRoot(y);
    if(rang[root1]>rang[root2])
        tata[root2]=root1;
    else
        tata[root1]=root2;

    if(rang[root1]==rang[root2])
        rang[root2]++;
}

int main()
{
    int x,y,q;
    f>>n>>m;
    for(i=0;i<n;i++)
    {
        tata[i]=i; rang[i]=1;
    }

    for(int qnumber=0;qnumber<m;qnumber++)
    {
        f>>q>>x>>y;
        if(q==1)
            unite(x,y);
        else
            if(findRoot(x)==findRoot(y))
               g<<"DA\n";
            else
               g<<"NU\n";
    }
    f.close();g.close();
    return 0;
}