Cod sursa(job #2073179)

Utilizator asztalos.l.danielA. B. Daniel asztalos.l.daniel Data 22 noiembrie 2017 19:40:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <stdlib.h>

#define NMAX 100000

using namespace std;

int tomb[NMAX],hossz[NMAX];
ifstream f("disjoint.in");
ofstream g("disjoint.out");

int root(int a){
    int i=a;
    while(i!=tomb[i]){
        tomb[i]=tomb[tomb[i]];
        i=tomb[i];
    }
    return i;
}

void unite(int a, int b){
    int root1=root(a);

    int root2=root(b);


    if(root1!=root2){
        //tomb[root1]=root2;
        if(hossz[root1]>hossz[root2]){
            tomb[root2]=root1;
            hossz[root1]+=hossz[root2];
        }
        else{
            tomb[root1]=root2;
            hossz[root2]+=hossz[root1];
        }
    }
}

void ask(int a,int b){
    int root1=root(a);
    int root2=root(b);

    if(root1==root2){
        g<<"DA\n";
    }
    else{
        g<<"NU\n";
    }
}

int main()
{

    int n,m,muv,a,b;
    f>>n>>m;
    bool ok;
    for(int i=1;i<=n;i++){
        tomb[i]=i;
        hossz[i]=1;
    }

    for(int i=0;i<m;i++){
        f>>muv>>a>>b;
        if(muv==1){
            unite(a,b);
        }
        else{
            ask(a,b);
        }
    }
    f.close();
    g.close();
    return 0;
}