Cod sursa(job #2037945)

Utilizator berindeiChesa Matei berindei Data 12 octombrie 2017 23:26:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int parinti[100001];
int elem[100001];
int root(int n){
    while (parinti[n]!=0)
        n = parinti[n];
    return n;
}
void mut(int r, int n){
    if(n==r)
        return;
    if (parinti[n]!=r)
        mut(r, parinti[n]);
    parinti[n]=r;

}
void q1(int n1, int n2){
    if (elem[n1]<elem[n2]) swap(n1, n2);
    int r1 = root(n1);
    int r2 = root(n2);
    parinti[r2] = r1;
    elem[r1]+=elem[r2];
}
void q2(int n1, int n2){
    int r1=root(n1);
    int r2=root(n2);
    if (r1 == r2)
        out << "DA\n";
    else
        out << "NU\n";
    mut (r1, n1);
    mut (r2, n2);
}
int main(){
    int n, m, i, t, n1, n2;
    in >> n >> m;
    for (i=1; i<=n; i++)
        elem[i] = 1;
    for (i=1; i<=m; i++){
        in >> t >> n1 >> n2;
        if (t == 1)
            q1(n1, n2);
        else
            q2(n1, n2);
    }
}