Cod sursa(job #544066)

Utilizator slycerdan dragomir slycer Data 28 februarie 2011 23:03:48
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.25 kb
/* 
 * File:   main.c
 * Author: slycer
 *
 * Created on March 1, 2011, 12:48 AM
 */

#include <stdio.h>
#include <stdlib.h>
int * d ; //= calloc(100000,sizeof(int)); 

int find( int x ){
    while ( d[x]!=x){
        x = d[x]; 
    }
    return x; 
}

int union_( int x, int y ){
    int a = find( x ); 
    int b = find( y ); 
    //if ( random()%2==0){
    //    d[a] = b; 
    //} else {
    //    d[b] = a; 
   // }
    if ( d[b] == b ){
        d[a] = b; 
    } else {
        d[a] = d[b]; 
    }
    
}

/*
 * 
 */
int main(int argc, char** argv) {
    d = calloc( 100001, sizeof(int )); 
    
    FILE * in = fopen("disjoint.in","r"); 
    FILE * out = fopen("disjoint.out","w");
    
    int n,m; 
    fscanf(in,"%d%d",&n,&m); 
    
    int i; 
    for ( i=1; i<=n; i++){
        d[i] = i; 
    }
    
    for ( i=1; i<=m; i++){
        int x,y,z; 
        fscanf(in,"%d%d%d",&x,&y,&z);
        if ( x == 1 ){
            union_(y,z); 
        }       
        if ( x == 2 ){
            int a = find(y); 
            int b = find(z); 
            if ( a==b){
                fprintf(out,"DA\n"); 
            } else {
                fprintf(out,"NU\n"); 
            }
        }
    }
    
    
    fclose( in ); 
    fclose( out ); 
    
    return (EXIT_SUCCESS);
}