Cod sursa(job #345498)

Utilizator aghamatMorariu Razvan aghamat Data 3 septembrie 2009 13:24:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>

#define DIM 1000000

int n, m, tata[DIM], rang[DIM];

int find(int k)
{
    int r;
    for (r=k; r!=tata[r]; r=tata[r]);
    
    while (tata[k]!=k)
    {
        int tmp=tata[k];
        tata[k]=r;
        k=tmp;
        }
    return r;
    }

void unite(int k, int l)
{
    if (rang[k]>rang[l])
        tata[l]=k;
    else 
        tata[k]=l;
    if (rang[k]==rang[l])
        rang[l]++;
    }

int main()
{
    int i, x, y, op;
    freopen ("disjoint.in","r",stdin);
    freopen ("disjoint.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    
    for (i=1; i<=n; ++i)
    {
        tata[i]=i;
        rang[i]=1;
        }
    
    for (i=1; i<=m; ++i)
    {
        scanf("%d%d%d",&op,&x,&y);    
        if (op==2)
            if (find(x)==find(y))   printf("DA\n");
            else printf("NU\n");
        else
        {    
            unite (find(x), find(y));
            }
        }
    return 0;       
}