Pagini recente » Cod sursa (job #142778) | Cod sursa (job #2348331) | Cod sursa (job #2751919) | Cod sursa (job #1700646) | Cod sursa (job #2795804)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int find(int x, vector < int > &t){
int r, y;
//merg in subgraf pana la radacina
for( r = x; t[r] != r; r = t[r] );
for(x = x; t[x] != x; x = t[x] ){
y = t[x];
t[x] = r;
x = y;
}
return r;
}
void unite(int x, int y, vector < int > &rang, vector < int > &t){
if( rang[x] > rang[y] ){
t[y] = x;
}
else t[x] = y;
if( rang[x] == rang[y] ) rang[y]++;
}
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out")
int x, y, operatie;
int n, m;
fin >> n >> m;
vector < int > t;
vector < int > rang;
rang.push_back(-1);
t.push_back(0);
for( int i = 1; i <= n; i++ ){
t.push_back(i);
rang.push_back(1);
}
for( int i = 1; i <= m; i++ ){
fin >> operatie >> x >> y;
if( operatie == 2 ){
if( find(x,t) == find(y,t) ) fout << "DA" << "\n";
else fout << "NU" << "\n";
}
else{
unite(find(x,t), find(y,t),rang,t);
}
}
}