Cod sursa(job #181661)

Utilizator slayer4uVictor Popescu slayer4u Data 18 aprilie 2008 18:20:37
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>

long depth, max, i, n, j, y[5001], x[5001], a[5001], b[5001], c[5001], used[5001];

long egale(long i)
{
	if (a[i] == b[i] || b[i] == c[i] || a[i] == c[i])
		return 1;
	return 0;
}

long min(long a, long b)
{
	return a < b ? a : b;
}

void do_(long st, long dr)
{
	++depth;
	if (st > dr)
	{
		--depth;
		return;
	}

	max = max < depth ? depth : max;

	if (st == dr)
	{
		--depth;
		for (long l = 1; l <= n; ++l)
		{
			if (!x[l])
			{
				x[l] = st;
				break;
			}
		}
		return;
	}
	
	long k = egale(dr - st);

	if (k)
	{
		long pas = 0;
		for (long l = 1; l <= n; ++l)
		{
			if (!x[l])
				++pas;
			if (pas == b[dr - st])
			{
				x[l] = st;
				break;
			}
		}

		do_(st + 1, dr);
	}
	else
	{
		long pas = 0;
		for (long l = 1; l <= n; ++l)
		{
			if (!x[l])
			{
				++pas;
				if (pas == a[dr - st])
					x[l] = st;
				else
				if (pas == b[dr - st])
				{
					x[l] = st + 1; 
					break;
				}
			}
		}

		do_(st + 2, dr);
	}
	--depth;
}

void swap(long &a, long &b)
{
	long c = a;
	a = b;
	b = c;
}

int main()
{
	freopen ("sortare.in", "rt", stdin);
	freopen ("sortare.out", "wt", stdout);
	
	scanf("%ld", &n);
	for (i = 1; i < n; ++i)
	{
		scanf("%ld %ld %ld", &a[i], &b[i], &c[i]);
		
		if (b[i] > c[i])
			swap(b[i], c[i]);
		if (a[i] > b[i])
			swap(a[i], b[i]);
		if (b[i] > c[i])
			swap(b[i], c[i]);
	}

	do_(1, n);

	printf("%ld\n", max);
	j = 1;
	for (i = 1; i <= n; ++i)
	{
		if (x[i])
			printf("%ld ", x[i]);
		else
		{
			printf("%ld ", y[j]);
			++j;
		}
	}
	printf("\n");
	return 0;
}