Pagini recente » Soluţii ONIS 2016, Runda 2 | Cod sursa (job #1555518) | Cod sursa (job #1723072) | Cod sursa (job #2330140) | Cod sursa (job #1468898)
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
struct elem{int h,rad;} nod[NMAX];
int op, nod1, nod2, n, m;
int radacina(int nod1)
{
while(nod[nod1].rad != nod1 )
nod1 = nod[nod1].rad;
return nod1;
}
void AddRadacina(int nod1,int r)
{
int nod2;
while(nod[nod1].rad != r )
nod2 = nod1, nod1 = nod[nod1].rad, nod[nod2].rad = r;
}
void unire(int nod1,int nod2)
{
int r1 = radacina(nod1);
int r2 = radacina(nod2);
if(nod[r1].h >= nod[r2].h)
nod[r2].rad = r1, nod[r1].h = max( nod[r1].h , nod[r2].h + 1);
else
nod[r1].rad = r2, nod[r2].h = max( nod[r2].h , nod[r1].h + 1);
}
bool verif(int nod1,int nod2)
{
int r1 = radacina(nod1);
int r2 = radacina(nod2);
AddRadacina(nod1,r1);
AddRadacina(nod2,r2);
return r1==r2;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
nod[i].rad = i, nod[i].h = 1;
for(int i=1;i<=m;i++)
{
fin>>op>>nod1>>nod2;
if(op==1)
{
unire(nod1,nod2);
}
else
{
if(verif(nod1,nod2))
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
}
return 0;
}