Cod sursa(job #750375)

Utilizator yamahaFMI Maria Stoica yamaha Data 21 mai 2012 22:57:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<fstream>
using namespace std;

#define nmax 100001
int T[nmax],rang[nmax];

void set(int x)
{
	T[x]=x;
	rang[x]=1;
}

void reuniune(int x,int y)
{
	if(rang[x]>rang[y]) T[y]=x;
	else if(rang[y]>rang[x]) T[x]=y;
	else if(rang[x]==rang[y]){ T[x]=y; rang[y]++; }
}

int root(int x)
{
	int i,aux;
	for(i=x;i!=T[i];i=T[i]);
	while(x!=T[x])
    {
		aux=T[x];
		T[x]=i;
		x=aux;
	}
	return i;
}


int main()
{
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	
	int N, M, op, x, y;
	
	f>>N>>M;
	for(int i=1;i<=N;i++) set(i);
	for(int i=1;i<=M;i++)
    {
		f>>op>>x>>y;
		if(op==1)
			reuniune(root(x),root(y));
		if(op==2)
			if(root(x)==root(y))
				g<<"DA\n";
			else
				g<<"NU\n";
	}
	
	
	return 0;
}