Cod sursa(job #633148)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 13 noiembrie 2011 00:00:51
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<fstream>
//#include<ctime>
#include<vector>
using namespace std;

vector <int> tata, rang;

int Find(int x){
	if (tata[x] == x) return x;
		else{
			tata[x] = Find(tata[x]);
			return tata[x];
		}
}

void Merge (int &x, int &y){
	int xRoot = Find(x), yRoot = Find(y);
	if (xRoot == yRoot) return;
	
	(rang[xRoot] >= rang[yRoot]) ? tata[yRoot] = xRoot : tata[xRoot] = yRoot;
	if (rang[xRoot] = rang[yRoot]) rang[xRoot]++;
}

int main(){
	//long start, stop;
	//start = clock();
	int n, m, i, tip, x, y;
	ifstream fin("disjoint.in");
	ofstream fout("disjoint.out");
 
	fin>>n>>m;
	
	for (i = 0; i <= n; i++) tata.push_back(i);
	rang.assign(n+1, 1);
	
	for (i = 1; i <= m; i++){
		fin >> tip >> x >> y;
		if (tip == 1) Merge(x, y);
			else Find(y) == Find(x) ? printf("DA\n") : printf("NU\n");
	}
	
	//stop = clock();
	//fout << 1.0*(stop - start)/CLOCKS_PER_SEC;
	return 0;
}