Pagini recente » Cod sursa (job #1985178) | Cod sursa (job #1580832) | Cod sursa (job #2389560) | Cod sursa (job #1863122) | Cod sursa (job #447020)
Cod sursa(job #447020)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
typedef struct
{
int rang;
int parinte;
} Disjoint;
static int multime(Disjoint sets[], int a)
{
if (sets[sets[a].parinte].parinte != sets[a].parinte)
sets[a].parinte = multime(sets, sets[a].parinte);
return sets[a].parinte;
}
static inline void uneste(Disjoint sets[], int a, int b)
{
a = multime(sets, a);
b = multime(sets, b);
if (a == b) return;
if (sets[a].rang > sets[b].rang)
{
sets[b].parinte = a;
}
else if (sets[a].rang < sets[b].rang)
{
sets[a].parinte = b;
}
else
{
sets[b].parinte = a;
sets[a].rang++;
}
}
int main()
{
int n, m;
ifstream fisIn("disjoint.in");
fisIn >> n >> m;
ofstream fisOut("disjoint.out");
Disjoint *sets = new Disjoint[n+1];
for (int i=1; i<=n; i++)
{
sets[i].rang = 0;
sets[i].parinte = i;
}
while (m--)
{
int op, a, b;
fisIn >> op >> a >> b;
if (op == 1)
{
uneste(sets,a,b);
}
else
{
fisOut << ((multime(sets,a) == multime(sets,b)) ? "DA\n" : "NU\n");
}
}
}