Pagini recente » Cod sursa (job #1810822) | Cod sursa (job #2602519) | Cod sursa (job #3134697) | Cod sursa (job #2278655) | Cod sursa (job #938850)
Cod sursa(job #938850)
#include <fstream>
#define In "disjoint.in"
#define Out "disjoint.out"
#define Nmax 100005
using namespace std;
///a[i] pointeza catre nodul tata al varfului i
///sau -1 daca acesta este terminal
int a[Nmax];
inline int Find(int nod)
{
int R=nod,aux;
while(a[R]>0)//nodul nu este terminal
R = a[R];
//aplic compresia drumurilor
while(a[nod]>0)
{
aux = a[nod];
a[nod] = R;
nod = aux;
}
return R;
}
inline void Union(int x,int y)
{
if(a[x]>a[y])
{
a[y]+=a[x];
a[x] = y;
}
else
{
a[x]+=a[y];
a[y] = x;
}
}
int main()
{
int i,n,m,op,x,y;
ifstream f(In);
ofstream g(Out);
f>>n>>m;//n numarul de noduri,m numarul de operatii
for(i=1;i<=n;i++)
a[i] = -1;
while(m--)
{
f>>op>>x>>y;
if(op==2)
{
if(Find(x)==Find(y))
g<<"DA\n";
else
g<<"NU\n";
}
else
Union(x,y);
}
return 0;
}