Pagini recente » Solutii preONI 2007, Runda 3 | Cod sursa (job #1383318) | Cod sursa (job #22091) | Cod sursa (job #2071727) | Cod sursa (job #972330)
Cod sursa(job #972330)
#include <fstream>
using namespace std;
const int MAX_N = 100002;
int N, M;
int H[MAX_N], F[MAX_N];
inline int find(int x) {
int R = x;
while(R != F[R])
R = F[R];
while(F[x] != x) {
int temp = F[x];
F[x] = R;
x = temp;
}
return R;
}
inline void unite(int x, int y) {
if(H[x] > H[y])
F[y] = x;
else F[x] = y;
if(H[x] == H[y])
++H[y];
}
int main() {
ifstream f("disjoint.in");
ofstream g("disjoint.out");
f >> N >> M;
for(int i = 1; i <= N; ++i)
F[i] = i, H[i] = 1;
for(int i = 1, t, x, y; i <= M; ++i) {
f >> t >> x >> y;
if(t == 1)
unite(F[x], F[y]);
else if(find(F[x]) == find(F[y]))
g << "DA\n";
else g << "NU\n";
}
f.close();
g.close();
return 0;
}