Cod sursa(job #2041823)

Utilizator DawlauAndrei Blahovici Dawlau Data 17 octombrie 2017 19:49:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
const int NMAX=100005;
int tree[NMAX],height[NMAX],n,m;
void read_data(){
    int i;
    fin>>n>>m;
    for(i=1;i<=n;++i){
        tree[i]=i;
        height[i]=1;
    }
}
int same_tree(int x){
    int root,aux;
    for(root=x;tree[root]!=root;root=tree[root]);
    while(tree[x]!=x){
        aux=tree[x];
        tree[x]=root;
        x=tree[x];
    }
    return root;
}
void unite(int x,int y){
    if(height[x]>height[y])
        tree[y]=x;
    else
        tree[x]=y;
    if(height[x]==height[y])
        ++height[y];
}
void solve(){
    int code,x,y;
    while(m--){
        fin>>code>>x>>y;
        int x_find=same_tree(x);
        int y_find=same_tree(y);
        if(code==1){
            if(x_find!=y_find)
                unite(x_find,y_find);
        }
        else{
            if(x_find==y_find)
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
    }
}
int main(){
    read_data();
    solve();
}