Cod sursa(job #957601)

Utilizator Anca_PaneaPanea Anca Anca_Panea Data 5 iunie 2013 15:50:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
using namespace std;
#include<fstream>
#define NMax 100005
ifstream eu("disjoint.in");
ofstream tu("disjoint.out");
int N,M,TT[NMax],RG[NMax];
void unite(int x, int y)
{
if(RG[x]<RG[y])
		TT[x]=y;
	if(RG[y]<RG[x])
		TT[y]=x;
	if(RG[x]==RG[y])
	{
		TT[x]=y;RG[y]++;
	}	
}
int find(int x)
{
	int R=x;
	while(R!=TT[R])
		R=TT[R];
		
	while(x!=TT[x])
		{
		int Father=TT[x];
		TT[x]=R;
		x=Father;
		}
	return x;
	
}
int main()
{
int op,x,y;
eu>>N>>M;
for(int i=1;i<=N;i++)
{
	TT[i]=i;
	RG[i]=0;
}
while(M--)
	{
	eu>>op>>x>>y;
	if (op==1)
		unite(find(x),find(y));
	if(op==2)
		if(find(x)==find(y))
			tu<<"DA\n";
		else
			tu<<"NU\n";
	}
return 0;
}