Cod sursa(job #1487931)

Utilizator zertixMaradin Octavian zertix Data 17 septembrie 2015 17:28:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <cstdio>
#define maxc 100005

using namespace std;

int n,m,op,h[maxc],G[maxc],y,x;



int findn(int x)
{
    int i=x,aux;
    while (G[i] != i)
        i=G[i]; ///caut radacina

    for (; G[x]!=x;)
    {
        aux=G[x]; ///salvez spre ce e orientat initial nodul
        G[x]=i; ///orientez nodul actual spre radacina
        x=aux; ///merg mai departe pe conexiunea veche
    }
    return i;
}

void unite (int x,int y)
{
    if (h[x] > h[y]) ///unire multimea de rang mai mic cu cea de rang mai mare
        G[y]=x;
        else G[x]=y;

    if (h[x]==h[y])
        ++h[y];
}

void rezolv()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i)
    {
        G[i]=i;
        h[i]=1;
    }


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


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