Cod sursa(job #2340229)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 10 februarie 2019 09:28:52
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
using namespace std;
const int Maxx=1e5+1;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int dad[Maxx];
int range[Maxx];
int n,m;
int cd,x,y;
int parent(int x){
    int a,b;
    for (a=x;dad[a]!=a;a=dad[a]);
    //compresia drumurilor
    for (;dad[x]!=x;){
        b=dad[x];
        dad[x]=a;
        x=b;
    }
    return a;
}
void unite(int x,int y){
    if (range[x]>range[y]) {
        dad[y]=x;
    } else {
        dad[x]=y;
    }
    if (range[x]==range[y]) ++range[y];
}
int main() {
    fin>>n>>m;
    int i;
    for (i=1;i<=n;++i){
        dad[i]=i;
        range[i]=1;
    }
    for(;m;--m){
        fin>>cd>>x>>y;
        if (cd==1){
            unite(parent(x),parent(y));
            continue;
        }
        if (parent(x)==parent(y)){
            fout<< "DA\n";
        } else {
            fout<< "NU\n";
        }
    }
    return 0;
}