Cod sursa(job #650154)

Utilizator johnny2008Diaconu Ion johnny2008 Data 17 decembrie 2011 14:31:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
#define nmax 100000
int tata[nmax];
int mare[nmax];
int n,m;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
void reunire(int tata1,int tata2){
	
	if(tata1==tata[tata1] && tata2==tata[tata2])
		mare[tata1]+=mare[tata2];
	else
	if(tata1==tata[tata1] && tata2!=tata[tata2])
		reunire(tata1,tata[tata2]);
	else
	if(tata1!=tata[tata1] && tata2==tata[tata2])
		reunire(tata[tata1],tata2);
	else
	if(tata1!=tata[tata1] && tata2!=tata[tata2])
		reunire(tata[tata1],tata[tata2]);
	tata[tata2]=tata[tata1];
}
void verif(int a,int b){
	while(a!=tata[a])
		a=tata[a];
	while(b!=tata[b])
		b=tata[b];
	if(a==b)
		g<<"DA\n";
	else
		g<<"NU\n";
}	
int main(){
	
	f>>n>>m;
	int i,j;
	for(i=1;i<=n;i++){
		tata[i]=i;
		mare[i]=1;
	}
	for(i=1;i<=m;i++){
		int a,b,c;
		f>>a>>b>>c;
		if(a==1){
			int x=b,y=c;
			while(b!=tata[b])
				b=tata[b];
			while(c!=tata[c])
				c=tata[c];
			if(mare[b]>=mare[c])
				reunire(x,y);
			else
				reunire(y,x);
		}
		else
			verif(b,c);
	}
	return 0;
}