Pagini recente » Cod sursa (job #1140480) | Cod sursa (job #538679) | Cod sursa (job #588865) | Cod sursa (job #2189067) | Cod sursa (job #2694756)
#include<fstream>
using namespace std;
ifstream fi("disj.in");
ofstream fo("disj.out");
int N,M,i,j,k,c,x,y;
struct Edge
{
int x,y,p;
};
struct Subset
{
int parent, rank;
};
int Find(Subset S[], int i)
{
if(S[i].parent!=i) S[i].parent = Find(S, S[i].parent);
return S[i].parent;
}
void Union(Subset S[], int x, int y)
{
int xr=Find(S, x);
int yr=Find(S, y);
if (S[xr].rank < S[yr].rank) S[xr].parent = yr, S[yr].rank++;
else S[yr].parent = xr, S[xr].rank++;
}
int main()
{
fi >> N >> M;
Subset S[N+1];
for(i=1; i<=N; i++) S[i].parent=i, S[i].rank=0;
for(i=1; i<=M; i++)
{
fi >> c >> x >> y;
if(c==2)
{
if(Find(S,x)==Find(S,y)) fo << "DA\n"; else fo << "NU\n";
}
else
{
if(Find(S,x)==Find(S,y)) fo << i << '\n';
Union(S,x,y);
}
}
}
//se poate de optimizat prin excluderea vectorulu S din declaratie