Cod sursa(job #497714)

Utilizator arnold23Arnold Tempfli arnold23 Data 3 noiembrie 2010 09:52:06
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define sizen 100010
#define sizem 100010

long n,m,k,x,y,i;
long t[sizen],r[sizem];

using namespace std;

int init() {
 //kezdetben minden elem sajat magara mutat a rang pedig 1
 for (int p=1;p<=n;++p) {
     t[p]=p;
     r[p]=1;    
 }   
    
 return 0;   
}

int insert(long egyik, long masik) {
 //a kisebb ranguhoz kotom
 if (r[egyik]<r[masik]) t[egyik]=masik;
 else t[masik]=egyik;    
    
 if (r[egyik]==r[masik]) ++r[masik];   
 return 0;    
}

int find(long ker) {
 long p,q;
 //addig megyek a faba fel amig nem a gyoker
 for (p=ker;p!=t[p];p=t[p]);

 //a keresettet egybool a gyokerhez kotom h legkozelebb egybol meglegyen 
 while (t[ker]!=p) {
       q=t[ker];
       t[ker]=p;
       ker=q;             
 }
     
}

int main() {
    
 ifstream in("disjoint.in");
 ofstream out("disjoint.out");
   
 in >> n >> m;
    
 init();
 for (i=1;i<=m;++i) {
    in >> k >> x >> y;
    if (k==1) insert(x,y); else 
    if (k==2)
       if (find(x)==find(y)) out << "DA\n";
       else out << "NU\n";    
 }
    
 in.close();
 out.close();

 return 0;
}