Pagini recente » Cod sursa (job #948125) | Cod sursa (job #1620996) | Cod sursa (job #1905537) | Cod sursa (job #1969734) | Cod sursa (job #2944411)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int Find (int x, vector<int> & tata ){
// calculam "seful"
int y = x, t;
while (y != tata[y])
y = tata[y];
// retragem muchiile
while (x != y){
t = tata[x];
tata[x] = y;
x = t;
}
return x;
}
// setare parinti
void Unite (int x, int y, vector<int>& tata){
x = Find(x, tata);
y = Find(y, tata);
tata[y] = x;
}
int main() {
// citire date
ifstream f ("disjoint.in");
int n, m;
int x, y, op;
int i;
f >> n >> m;
vector<int> tata(n+1);
// init tata
for(i=1; i<=n; i++)
tata[i] = i;
ofstream g ("disjoint.out");
for (i=1; i<=m; i++){
f >> op >> x >> y;
if (op == 1){
if (Find(x, tata) != Find(y, tata))
Unite(x, y, tata);
}
else {
if (Find(x, tata) == Find(y, tata))
g << "DA\n";
else
g << "NU\n";
}
}
f.close();
g.close();
return 0;
}
// complexitate add/ search = log*n (opusul lui ackerman)
// spatiu O(n) - vectorul de tati