Cod sursa(job #1791834)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 29 octombrie 2016 19:26:33
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MaxN 100005
using namespace std;

FILE *IN,*OUT;

int N,M,Type,X,Y,v[MaxN];

void Unite(int x,int y)
{
	int aux;
	while(v[y]!=y)
		y=v[y];
	do
	{
		aux=v[x];
		v[x]=y;
		x=aux;
	}
	while(v[x]!=x);
}

void Check(int x,int y)
{
	int aux=x;
	while(v[y]!=y)
		y=v[y];
	
	while(v[x]!=x)
		x=v[x];
	if(x==y)
	{
		fprintf(OUT,"DA\n");
		while(v[aux]!=y)
		{
			x=v[aux];
			v[aux]=y;
			aux=x;
		}
	}
	else fprintf(OUT,"NU\n");
}

int main()
{
    IN=fopen("disjoint.in","r");
    OUT=fopen("disjoint.out","w");

	fscanf(IN,"%d%d",&N,&M);
	for(int i=1;i<=N;i++)
		v[i]=i;
	for(int i=1;i<=M;i++)
	{
		fscanf(IN,"%d%d%d",&Type,&X,&Y);
		if(Type==1)
			Unite(X,Y);
		else Check(X,Y);
	}
    
	return 0;
}