Pagini recente » Cod sursa (job #2316249) | Cod sursa (job #1102914) | Cod sursa (job #1603316) | Cod sursa (job #104846) | Cod sursa (job #2475645)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m, Tata[100001], Rang[100001], v, x, y;
int Find(int nr)
{ int R;
R=nr;
//Gasim radacina fiecarui nod
while(Tata[R]!=R)
R=Tata[R];
//Compresia drumurilor
Tata[nr]=R;
return R;
}
inline void Unite(int x, int y)
{ //Atasam arborele mai mic de radacina arborelui mai mare
if(Rang[x]>Rang[y])
Tata[y]=x;
else Tata[x]=y;
//Daca atasam de y marim rangul lui y
if(Rang[x]==Rang[y])
Rang[y]++;
}
inline void Citire()
{ int i;
f>>n>>m;
//Initial avem n arbori cu un singur nod
for(i=1;i<=n;i++)
{Tata[i]=i;
Rang[i]=1;}
for(i=1;i<=m;i++)
{f>>v;
f>>x>>y;
if(v==1)
{ Unite(Find(x),Find(y));
}
else { if(Find(x)==Find(y))
g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
}
}
int main()
{
Citire();
f.close();
g.close();
return 0;
}