Cod sursa(job #1695219)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 26 aprilie 2016 19:30:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#define NMAX 100005
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define pb push_back

using namespace std;

typedef pair<int, int> pii;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int p[NMAX], rang[NMAX];

int findSet(int x);
bool inSameSet(int x, int y);
void unionSet(int x, int y);

int main() {
	int n,m,op,x,y,i;

	fin>>n>>m;

	for(i=1;i<=n;++i) {
		p[i]=i;
		rang[i]=1;
	}

	for(i=0;i<m;++i) {
		fin>>op>>x>>y;

		if(op == 1)
			unionSet(x,y);
		else{
			if(inSameSet(x,y)) fout<<"DA\n";
			else fout<<"NU\n";
		}
	}

	return 0;
}

int findSet(int x) {
	if(p[x]==x)
		return x;

	return p[x]=findSet(p[x]);
}
bool inSameSet(int x, int y) {
	return findSet(x)==findSet(y);
}

void unionSet(int x, int y) {
	if(!inSameSet(x,y)) {
		int i=findSet(x),j=findSet(y);

		if(rang[i] > rang[j])
			p[j]=i;
		else {
			p[i]=j;
			if(rang[i] == rang[j]) ++rang[j];
		}
	}
}