Pagini recente » Cod sursa (job #346332) | Cod sursa (job #2408274) | Cod sursa (job #3173458) | Cod sursa (job #1161024) | Cod sursa (job #447010)
Cod sursa(job #447010)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
typedef struct
{
int rang;
int parinte;
} Disjoint;
static int multime(Disjoint sets[], int a)
{
while (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)
{
int mulA = multime(sets, a);
int mulB = multime(sets, b);
if (mulA == mulB) 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");
}
}
}