Cod sursa(job #1487708)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 17 septembrie 2015 12:20:17
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;

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

long t,x,y,n,m,i,j;
struct grupe
{
    long nr,ant;
}gr[100004];

long rad(long nod,long &lg)
{
    if (gr[nod].ant!=-1)
    {
        nod=gr[nod].ant;
        lg++;
        rad(nod, lg);
    }
    else
        return nod;
}

void uneste(long x,long y)
{
    long lgx=1,lgy=1,rx,ry,sav;
    rx=rad(x,lgx);
    ry=rad(y,lgy);
    if (lgx<=lgy)
    {
        while (x!=-1)
        {
            sav=gr[x].ant;
            gr[x].ant=ry;
            gr[x].nr=gr[ry].nr;
            x=sav;
        }
    }
    else
    {
        while(y!=-1)
        {
            sav=gr[y].ant;
            gr[y].ant=rx;
            gr[y].nr=gr[rx].nr;
            y=sav;
        }
    }
}

long qu(long x,long y)
{
    long rx,ry,lgx,lgy;
    rx=rad(x,lgx);
    ry=rad(y,lgy);
    if(gr[rx].nr==gr[ry].nr)
        return 1;
    return 0;
}

int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        gr[i].nr=i;
        gr[i].ant=-1;
    }
    for (i=1;i<=m;i++)
    {
        f>>t>>x>>y;
        if (t==1)
        {
            if (qu(x,y)==0)
            uneste(x,y);
        }
        else
        {
            if (qu(x,y)==1)
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }

    return 0;
}