Cod sursa(job #664458)

Utilizator laurionLaurentiu Ion laurion Data 20 ianuarie 2012 09:43:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<fstream>

using namespace std;
int root[100000+10];

int find(int x)
{
    int r = x;
    while(root[r]!=r)
        r=root[r];

    //compresia drumurilor
    while(root[x]!=x)
    {
        int tmp;
        tmp=root[x];
        root[x]=r;
        x=tmp;
    }
    return r;
}

void join(int x, int y)
{
	//unim radacinile
    x=find(x);
    y=find(y);

    if(rand()%2)
        root[y]=x;
    else
        root[x]=y;
}
bool check(int x, int y)
{
    return find(x) == find(y);
}
int main()
{
	fstream f("disjoint.in",ios::in);
    fstream g("disjoint.out",ios::out);

    srand(time(0));

    int n,m;

    f>>n>>m;

    for(int i=1;i<=n;++i)
        root[i]=i;
    for(;m;--m)
    {
        int type,x,y;
        f>>type>>x>>y;
        if(type == 1)
        {
            join(x,y);
//            for(int i=1;i<=n;++i)
//                cerr<<root[i]<<' ';
        }
        else
        {
            g<<(check(x,y)?"DA":"NU")<<'\n';
        }
    }

    return 0;
}