Cod sursa(job #1878082)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 13 februarie 2017 21:10:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>

using namespace std;

int n,m,t;
int parent[100001];
int depth[100001];

int mx(int a,int b)
{
    if(a>b)
    {
        return a;
    }
    return b;
}

void join(int x,int y)
{
    int p1=x,p2=y;

    while(p1!=parent[p1])
    {
        p1=parent[p1];
    }
    while(p2!=parent[p2])
    {
        p2=parent[p2];
    }

    int top;
    if(depth[p1]>depth[p2])
    {
        top=p1;
        parent[p2]=p1;
        depth[p1]=mx(depth[p1],depth[p2]+1);
    }
    else
    {
        top=p2;
        parent[p1]=p2;
        depth[p2]=mx(depth[p2],depth[p1]+1);
    }

    p1=x;
    p2=y;
    while(p1!=parent[p1])
    {
        parent[p1]=top;
        p1=parent[p1];
    }
    while(p2!=parent[p2])
    {
        parent[p2]=top;
        p2=parent[p2];
    }
}

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

    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        parent[i]=i;
        depth[i]=1;
    }

    int x,y;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&t,&x,&y);
        if(t==1)
        {
            join(x,y);
        }
        else
        {
            while(x!=parent[x])
            {
                x=parent[x];
            }
            while(y!=parent[y])
            {
                y=parent[y];
            }
            if(x==y)
            {
                printf("DA\n");
            }
            else
            {
                printf("NU\n");
            }
        }
    }
}