Pagini recente » Cod sursa (job #248901) | Cod sursa (job #1490159) | Rating Stan Ana (yana25) | Cod sursa (job #2903354) | Cod sursa (job #2144357)
#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;
}