Pagini recente » Diferente pentru dot-com/2012 intre reviziile 12 si 7 | Rating Grosu Roxana (GrosuRoxana99) | Cod sursa (job #483338)
Cod sursa(job #483338)
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
struct DisjointSet
{
int parent;
int rank;
};
void MakeSet(vector<DisjointSet>& dset)
{
for(int i=0; i<(int)dset.size(); ++i)
{
dset[i].parent=i;
dset[i].rank=0;
}
}
int Find(vector<DisjointSet>& dset,int x)
{
if(dset[x].parent==x)
return x;
dset[x].parent=Find(dset,dset[x].parent);
return dset[x].parent;
}
void Union(vector<DisjointSet>& dset, int x, int y)
{
int xRoot=Find(dset,x);
int yRoot=Find(dset,y);
if(dset[xRoot].rank > dset[yRoot].rank)
dset[yRoot].parent=xRoot;
else if(dset[xRoot].rank < dset[yRoot].rank)
dset[xRoot].parent=yRoot;
else if(xRoot!=yRoot)
{
dset[yRoot].parent=xRoot;
dset[xRoot].rank++;
}
}
int main()
{
int n,m,type,x,y;
fstream fin("disjoint.in", fstream::in);
fstream fout("disjoint.out", fstream::out);
vector<DisjointSet> dset;
fin>>n>>m;
dset.resize(n+1);
MakeSet(dset);
/*cout<<n<<" "<<m<<endl;
Union(dset,1,2);
Union(dset,3,4);
//cout<<Find(dset,2)<<" "<<Find(dset,3)<<endl;
cout<<(Find(dset,1) == Find(dset,3))<<endl;
Union(dset,1,3);
cout<<(Find(dset,1) == Find(dset,4))<<endl;*/
for(int i=0; i<m; ++i)
{
fin>>type>>x>>y;
switch(type)
{
case 1:
Union(dset,x,y);
break;
case 2:
{
if(Find(dset,x) == Find(dset,y))
fout<<"DA\n";
else
fout<<"NU\n";
}; break;
}
}
fin.close();
fout.close();
return 0;
}