Cod sursa(job #1908820)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 7 martie 2017 10:36:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int n,m;
int tata[100010];
int sz[100010];

void connect(int nod1,int nod2)
{
    int tata1=nod1,tata2=nod2;

    while(tata1!=tata[tata1])
    {
        tata1=tata[tata1];
    }
    while(tata2!=tata[tata2])
    {
        tata2=tata[tata2];
    }

    if(sz[tata1]>sz[tata2])
    {
        sz[tata1]=max(sz[tata1],sz[tata2]+1);
        tata[tata2]=tata1;
        tata2=nod2;
        int keep;
        while(tata2!=tata[tata2])
        {
            keep=tata[tata2];
            tata[tata2]=tata1;
            tata2=keep;
        }
    }
    else
    {
        sz[tata2]=max(sz[tata2],sz[tata1]+1);
        tata[tata1]=tata2;
        tata1=nod1;
        int keep;
        while(tata1!=tata[tata1])
        {
            keep=tata[tata1];
            tata[tata1]=tata2;
            tata1=keep;
        }
    }
}

int is_connected(int nod1, int nod2)
{
    int tata1=nod1,tata2=nod2;
    while(tata1!=tata[tata1])
    {
        tata1=tata[tata1];
    }
    while(tata2!=tata[tata2])
    {
        tata2=tata[tata2];
    }
    if(tata1==tata2)
    {
        return 1;
    }
    return 0;
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    scanf("%d %d",&n,&m);

    for(int i=1;i<=n;i++)
    {
        tata[i]=i;
        sz[i]=1;
    }

    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
        {
            connect(y,z);
        }
        else
        {
            if(is_connected(y,z)==1)
            {
                printf("DA\n");
            }
            else
            {
                printf("NU\n");
            }
        }
    }
}