Cod sursa(job #566672)

Utilizator Alexa13Preda Alexandra Alexa13 Data 29 martie 2011 10:44:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h> 

#define NMAX 100020 
int TT[NMAX], RG[NMAX]; 
int N, M;  
int find(int x) 
{ 
int R, y;
 for (R = x; TT[R] != 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); 
int i, x, y, cd; 
 for (i = 1; i <= N; i++) { 
 TT[i] = i; 
 RG[i] = 1; 
}  
for (i = 1; i <= M; i++)  { 
scanf("%d %d %d", &cd, &x, &y);  
 if (cd == 2){ if (find(x) == find(y)) printf("DA\n"); 
else printf("NU\n"); 
 } 
 else { 
 if (find(x) == find(y)) {fprintf(stderr,"%d ", i);return 0;} 
unite(find(x), find(y)); 
} } 
 return 0; 
}