Cod sursa(job #515451)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 21 decembrie 2010 15:57:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>
using namespace std;
#define NMAX 100000
const char infile[]="disjoint.in";
const char outfile[]="disjoint.out";

int N;
int M;

struct Nod
{
	Nod* tata;
	int indice;
	int rang;
};

Nod A[NMAX];

void init()
{
	for(int i=1;i<=N;i++)
	{
		A[i].tata=NULL;
		A[i].rang=1;
		A[i].indice=i;
	}
}

int parinte(int x)
{
	int a=x;
	int b;
	while(A[x].tata!=NULL)
	{
		x=A[x].tata->indice;
	}
	while(A[a].tata!=NULL)
	{
		b=a;
		a=A[a].tata->indice;
		A[b].tata=&A[x];
	}
	return x;
}

void uneste(int x,int y)
{
	int a=parinte(x);
	int b=parinte(y);

	if(A[a].rang>A[b].rang)
	{
		A[b].tata=&A[a];
		A[a].rang+=A[b].rang;
	}
	else
	{
		A[a].tata=&A[b];
		A[b].rang+=A[a].rang;
	}
}




void afisare(const char *s,fstream &fout)
{
	fout<<s<<"\n";
}

void citire()
{
	fstream fin(infile,ios::in);
	fstream fout(outfile,ios::out);
	fin>>N;
	init();
	fin>>M;
	int x,y,z;
	for(int i=1;i<=M;i++)
	{
		fin>>x;
		switch(x)
		{
			case(1):
				fin>>y>>z;
				uneste(y,z);
				break;
			case(2):
				fin>>y>>z;
				if(parinte(y) == parinte(z))
					afisare("DA",fout);
				else 
					afisare("NU",fout);
				break;
		}
	}

}


int main()
{
	citire();
}