Cod sursa(job #2019734)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 8 septembrie 2017 13:43:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;
int g[100001],tata[100001];
int find(int x)
{
    if(tata[tata[x]]!=tata[x])
        tata[x]=find(tata[x]);
    return tata[x];
}
void unite(int a,int b)
{
    a=find(a);
    b=find(b);
    if(a==b)
    return;
    if(g[a]<g[b])
    {
        tata[a]=b;
        g[b]+=g[a];
    }
    else
    {
        tata[b]=a;
        g[a]+=g[b];
    }
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n,x,y,m,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        tata[i]=i;
        g[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&v,&x,&y);
        if(v==1)
            unite(x,y);
        if(v==2)
            {
                if(find(x)==find(y))
                    printf("DA\n");
                else
                    printf("NU\n");
            }
    }
    return 0;
}