Cod sursa(job #2144357)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 26 februarie 2018 18:31:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#define NMAX 100020
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int T[NMAX], GR[NMAX], n, m, cerinta, x, y; //T vectorul care tine evidenta fiecarui element din ce multime face parte si GR tine evidenta rankului fiecarei multimi

int gaseste(int x){

int r, y;
for(r = x; T[r]!=r; r = T[r]); //caut radacina multimii din care face parte x

while(T[x]!=x){ //scurtez drumurile. In loc sa ma duc pe fiecare element pana la radacina multimii modific in T elementele prin care as trece punandu-le direct radacina

    y=T[x];
    T[x]=r;
    x=y;

}

return r;

}

void uneste(int x, int y){ //x si y sunt deja radacini intrucat functia se apeleaza doar pt radacini

if(GR[x]>GR[y])
    T[y]=x;
else T[x]=y;

if(GR[x]==GR[y]) GR[y]+=1;

}

int main()
{

f>>n>>m;
for(int i=1; i<=n; i++){
    T[i]=i;
    GR[i]=1;
    }

for(int i=1; i<=m; i++){

    f>>cerinta>>x>>y;
    if(cerinta == 1){
        uneste(gaseste(x), gaseste(y));
        }
    else{

        if(gaseste(x) == gaseste(y))
            g<<"DA \n";
        else
            g<<"NU \n";

    }

}

    return 0;
}