Cod sursa(job #677212)

Utilizator andunhillMacarescu Sebastian andunhill Data 9 februarie 2012 22:09:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<fstream>
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int N, M;
int h[100001];		//height of ith tree
int dad[100001];

int find(int x)
{	int root, tmp;
	
	for(root = x; root != dad[root]; root = dad[root]);
	
	while(x != root)
	{	tmp = dad[x];
		dad[x] = root;
		x = tmp;
	}
	return root;
}

int unite(int r1, int r2)
{	if(h[r1] < h[r2]) swap(r1, r2);
	
	dad[r2] = r1;
	if(h[r1] == h[r2]) h[r1]++;
}

int main()
{	int i, x, y, op;
	
	f>>N>>M;
	
	for(i = 1; i <= N; i++) dad[i] = i, h[i] = 1;
	
	for(i = 1; i <= M; i++)
	{	f>>op>>x>>y;
		
		if(op == 1) unite(find(x), find(y));
		else if(find(x) == find(y)) g<<"DA \n";
		else g<<"NU \n";
	}
	
	f.close();
	g.close();
	return 0;
}