Pagini recente » Cod sursa (job #598476) | Cod sursa (job #1459341) | Cod sursa (job #111062) | Cod sursa (job #454179) | Cod sursa (job #2663594)
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m;
int parent[100001];
int h[100001];
void uneste(int x, int y)
{
while (parent[x])
x = parent[x];
while (parent[y])
y = parent[y];
if (x == y)
return;
if (h[x] <= h[y])
{
parent[x] = y;
h[y] = max(h[y], h[x] + 1);
}
else
{
parent[y] = x;
h[x] = max(h[x], h[y] + 1);
}
}
bool verif(int x, int y)
{
int m1 = x, m2 = y;
while (parent[m1])
m1 = parent[m1];
while (parent[m2])
m2 = parent[m2];
int aux;
while (parent[x])
{
aux = x;
x = parent[x];
parent[aux] = m1;
}
while (parent[y])
{
aux = y;
y = parent[y];
parent[aux] = m2;
}
return (m1 == m2);
}
int main()
{
f >> n >> m;
for (int i=1; i<=n; i++)
h[i] = 1;
for (int i=1; i<=m; i++)
{
int tip, x, y;
f >> tip >> x >> y;
if (tip == 1)
uneste(x, y);
else
{
if (verif(x, y))
g << "DA\n";
else
g << "NU\n";
}
}
return 0;
}