Pagini recente » Utilizatori inregistrati la preONI 2007, Runda 2, Clasele 11-12 | Cod sursa (job #2579437) | Cod sursa (job #2100615) | Cod sursa (job #2858171) | Cod sursa (job #2946535)
#include <fstream>
#include <string.h>
#include <vector>
#include <cmath>
#include <queue>
#include <iostream>
using namespace std;
vector<int> parentVec;
vector<int> distVec;
int maxN, opCount, opType, a, b;
int GetRoot(int a) {
while (parentVec[a] != -1) {
a = parentVec[a];
}
return a;
}
void UnionSet(int a, int b) {
int rootA = GetRoot(a);
int rootB = GetRoot(b);
int distA = distVec[rootA];
int distB = distVec[rootB];
if (distA <= distB) {
parentVec[rootA] = rootB;
distVec[rootA] = distA + 1;
}
else {
parentVec[rootB] = rootA;
distVec[rootB] = distB + 1;
}
}
int main() {
ifstream myIn("disjoint.in");
myIn >> maxN >> opCount;
parentVec.resize(maxN, -1);
distVec.resize(maxN, 0);
ofstream myOut("disjoint.out");
for (int i = 0; i < opCount; i++) {
myIn >> opType >> a >> b;
a -= 1; b -= 1;
if (opType == 1) {
// reuniune
UnionSet(a, b);
}
else {
// bool
if (GetRoot(a) == GetRoot(b)) {
myOut << "DA" << endl;
}
else {
myOut << "NU" << endl;
}
}
}
myOut.close();
return 0;
}