Cod sursa(job #662854)

Utilizator madmanjonesJones the one madmanjones Data 17 ianuarie 2012 06:14:33
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>

#define MAX 100001

int v[2][MAX];
int n,m;

int find(int x)
{
	int a, b;
	a=x;
	while (v[0][a]!=a) a=v[0][a];
	while (v[0][x] != x)
	{
		b = v[0][x];
		v[0][x] = a;
		x = b;
	}
	return a;
}

void unite(int x, int y)
{
	if (v[1][x] > v[1][y])
		v[0][y] = x;
			else v[0][x] = y;
	if (v[1][x] == v[1][y]) v[1][y]++;
}

int main()
{
	FILE *in=fopen("bellmanford.in","r");
	FILE *out=fopen("bellmanford.out","w+");
	fscanf(in,"%d %d\n", &n, &m);
	int x,y,c;
	for (int i=1; i<=n; ++i)
	{
		v[0][i] = i;
		v[1][i] = 1;
	}
	for (int i=1; i<=m; ++i)
	{
		fscanf(in,"%d %d %d\n", &c, &x, &y);
		if (c == 2)
			{
				if (find(x) == find(y)) fprintf(out,"DA\n");
					else fprintf(out,"NU\n");
			}
		else unite(find(x), find(y));
	}
	fclose(in);
	fclose(out);
	return 0;
}