Mai intai trebuie sa te autentifici.
Cod sursa(job #2455157)
| Utilizator | Data | 10 septembrie 2019 21:02:29 | |
|---|---|---|---|
| Problema | Paduri de multimi disjuncte | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.14 kb |
#include <bits/stdc++.h>
#define NMAX 100000
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m, rr[NMAX + 6], pp[NMAX + 6];
int Find(int x)
{
int R = x;
for (; pp[R] != R; R = pp[R]);
while (pp[x] != x)
{
pp[x] = R;
x = pp[x];
}
return R;
}
void Unite(int x, int y)
{
int p1 = Find(x);
int p2 = Find(y);
if (p1 == p2)
return;
if (rr[p1] >= rr[p2])
{
if (rr[p1] == rr[p2])
{
rr[p1]++;
pp[p2] = p1;
}
else
{
pp[p2] = p1;
}
}
else
{
pp[p1] = p2;
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
pp[i] = i;
while (m--)
{
int p, x, y;
fin >> p >> x >> y;
if (p == 1)
{
Unite(x, y);
}
else
{
if (Find(x) == Find(y))
fout << "DA\n";
else
fout << "NU\n";
}
}
fin.close();
fout.close();
return 0;
}
