Pagini recente » Cod sursa (job #2193742) | Cod sursa (job #734714) | Cod sursa (job #233984) | Cod sursa (job #1939086) | Cod sursa (job #1783531)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector<int> parent,rang;
int n,m,x,y,caz;
int find(int x){
int R, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for (R = x; parent[R] != R; R = parent[R]);
//aplic compresia drumurilor
for (; parent[x] != x;)
{
y = parent[x];
parent[x] = R;
x = y;
}
return R;
}
void unite(int x, int y){
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (rang[x] > rang[y])
parent[y] = x;
else{
parent[y] = x;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
rang[y] = (rang[x]==rang[y]) ? rang[y]+=1 : rang[y];
}
}
int main()
{
fin>>n>>m;
parent.resize(n+1);
rang.resize(n+1);
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for (int i = 1; i <= n; i++){
parent[i] = i;
rang[i] = 1;
}
for(int i = 1; i <= m; i++){
fin>>caz>>x>>y;
switch(caz){
case 1:
//unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
unite(find(x),find(y));
break;
case 2:
//verific daca radacina arborilor in care se afla x respectiv y este egala
if(find(x)==find(y))
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
}
return 0;
}