Cod sursa(job #2695103)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 11 ianuarie 2021 19:50:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream>
using namespace std;

ifstream fi("disjoint.in");
ofstream fo("disjoint.out");

int N,M,i,j,k,c,x,y;

struct Edge
{
	int x,y,p;
};

struct Subset
{
	int parent, rank;
};

int Find(Subset S[], int i)
{
	if(S[i].parent!=i) S[i].parent = Find(S, S[i].parent);
	return S[i].parent;
}

void Union(Subset S[], int x, int y)
{
	int xr=Find(S, x);
	int yr=Find(S, y);

	if (S[xr].rank < S[yr].rank) S[xr].parent = yr, S[yr].rank++;
    else S[yr].parent = xr, S[xr].rank++;
}

int main()
{
	fi >> N >> M;
	Subset S[N+1];
	for(i=1; i<=N; i++) S[i].parent=i, S[i].rank=0;

	for(i=1; i<=M; i++)
	{
		fi >> c >> x >> y;
		if(c==2)
		{
			if(Find(S,x)==Find(S,y)) fo << "DA\n"; else fo << "NU\n";
		}
		else
		{
			if(Find(S,x)==Find(S,y)) fo << i << '\n';
			Union(S,x,y);
		}
	}
}