Cod sursa(job #483338)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 8 septembrie 2010 01:19:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#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;
}