Cod sursa(job #1185641)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 16 mai 2014 10:09:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
using namespace std;
int RG[100020],TT[100020],n,m;
int find(int x ){
    register unsigned int y , R;
    for(R = x; R != TT[R]; R = TT[R]);
    for( ; TT[x] != x ; ){
        y     = TT[x];
        TT[x] = R;
        x     = y;      }
    return R;
}
void unite( int x , int y ){
    if( RG[x] > RG[y] ) TT[y] = x;
    else                TT[x] = y;
    if( RG[x] == RG[y] ) ++RG[y];
}
int main(){
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d ", &n , &m);
    for( register int i = 1; i <= n; ++i )
        RG[i] = 1 , TT[i] = i;
    register int caz , x ,y;
    for( register int i = 1; i <= m; ++i  ){
        scanf("%d %d %d", &caz , &x , &y);
        if( caz == 2 )
            if( find(x) == find(y)  ) printf("DA\n");
            else                      printf("NU\n");
        else unite( find(x) , find(y)  ); }
    return 0;
}