Cod sursa(job #983964)

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