Cod sursa(job #1159165)

Utilizator shervladVlad Seremet shervlad Data 29 martie 2014 13:12:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#define MAXINT 100100
using namespace std;
FILE *f=fopen("disjoint.in","r");
FILE *fout=fopen("disjoint.out","w");

int n,m;
int rk[MAXINT],parinte[MAXINT];

int find_p(int x)
{
	int R=x,y;
	while(parinte[R]!=R)
		{R=parinte[R];}
	while(parinte[x]!=x)
	{
		y=parinte[x];
		parinte[x]=R;
		x=y;
	}
	return R;

}
void link(int x,int y)
{
	if(rk[x]>rk[y])
	{
		parinte[y]=x;
		return;
	}
	else
		parinte[x]=y;
	if(rk[x]==rk[y])
		rk[y]++;
}
void unite(int x, int y)
{
	link(find_p(x),find_p(y));
}
int main()
{
	fscanf(f,"%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		rk[i]=0;
		parinte[i]=i;
	}
	int op, el1,el2;

	for(int i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&op,&el1,&el2);
		//cout<<op<<" "<<el1<<" "<<el2<<endl;
		if(op==2)
		{
			if(find_p(el1)==find_p(el2))
				fprintf(fout,"DA\n");
			else
				fprintf(fout,"NU\n");
		}
		else
		{
			unite(el1,el2);
		}
	}
	return 0;
}