Cod sursa(job #457358)

Utilizator ati90atiNagy Attila ati90ati Data 18 mai 2010 23:50:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <vector>

int A[100000];

int main()
{
	FILE *f1;
	FILE *f2;
	int kod,n,m,x,y,j,X_csoport,Y_csoport;
	std::vector<int> X,Y;

	f1=fopen("disjoint.in","r");
	f2=fopen("disjoint.out","w");
	fscanf(f1,"%d %d \n",&n,&m);
	
	for (int i=1;i<=n;i++)
		A[i]=i;
	
	for (int i=0;i<m;i++)
	{
		fscanf(f1,"%d %d %d",&kod,&x,&y);
		
		if (kod==1)
		{
			X.resize(0);
			Y.resize(0);
			j=x;
			while (j!=A[j])
			{
				X.push_back(j);
				j=A[j];
			}
			X.push_back(j);
			
			j=y;
			while (j!=A[j])
			{
				Y.push_back(j);
				j=A[j];
			}
			Y.push_back(j);
			Y_csoport=j;

			for (std::vector<int>::iterator it=X.begin(); it<X.end(); it++)
				A[*it]=Y_csoport;			
						//amelyeken vegigjartunk mindegyiket ataliitjuk, hogy egyforma
						//halmazhoz tartozzon az y halmazaval, nem muszaly megjegyezni
						//ennek a halmaznak a "legfobb elemet", amelyikhez mindegyik tartozik

			for (std::vector<int>::iterator it=Y.begin(); it<Y.end(); it++)
				A[*it]=Y_csoport;
		}
		else
		{
						//ha kod==2, akkor nem muszaly elmenteni az elemeket vektorba,
						//hiszen nem valtoztatunk rajtuk, csak megkeressuk azt az elemet
						//(halmazt), amelyikhez a keresettek tartoznak
			j=x;
			while (j!=A[j])
				j=A[j];
			X_csoport=j;

			j=y;
			while (j!=A[j])
				j=A[j];
			Y_csoport=j;

			if (X_csoport==Y_csoport)
				fprintf(f2,"DA\n");
			else
				fprintf(f2,"NU\n");
		}
	}
	fclose(f1);
	fclose(f2);
}