Cod sursa(job #1159194)

Utilizator shervladVlad Seremet shervlad Data 29 martie 2014 13:34:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <stdio.h>

using namespace std;
FILE *fin=fopen("disjoint.in","r");
FILE *fout=fopen("disjoint.out","w");

struct node
{
	int prt;
	int rg;
};
void make_set(node* element,int i)
{
	element[i].prt=i;
	element[i].rg=0;
}
int find_p(node* element,int x)
{
	int R=x,y;
	while(element[R].prt!=R)
		R=element[R].prt;
	while(element[x].prt!=x)
	{
		y=element[x].prt;
		element[x].prt=R;
		x=y;
	}
	return R;
}
void link(node* element,int x, int y)
{
	if(element[x].rg>element[y].rg)
		element[y].prt=x;
	else
		element[x].prt=y;
	if(element[x].rg==element[y].rg)
		element[y].rg++;
}
void unite(node* element,int x, int y)
{
	link(element,find_p(element,x),find_p(element,y));
}


int main()
{
	int n,m;
	fscanf(fin,"%d %d",&n,&m);
	node element[n+6];
	for(int i=1;i<=n;i++)
		{make_set(element,i);}
	int op,el1,el2;
	for(int i=1;i<=m;i++)
	{
		fscanf(fin,"%d %d %d",&op,&el1,&el2);
		if(op==2)
		{
			if(find_p(element,el1)==find_p(element,el2))
				fprintf(fout, "DA\n");
			else
				fprintf(fout, "NU\n");
		}
		else
			unite(element,el1,el2);
	}
	return 0;
}