Cod sursa(job #586298)

Utilizator diac_paulPaul Diac diac_paul Data 30 aprilie 2011 14:25:10
Problema Guvern Scor 10
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.45 kb
#include <stdio.h>
#define NMax 200005
FILE *fin = fopen("guvern.in", "rt");
FILE *fout = fopen("guvern.out", "wt");

int n;
int x[NMax], y[NMax], t[NMax];

int d[NMax];

int ok(int bitset)
{
	for (int i = 0; i < n; i++) if (bitset & (1 << i))
	{
		int must = -1;
		for (int p = t[i]; p != -1; p = t[p])
		{
			if (bitset & (1 << p))
			{
				if (d[p] < d[i])
					return 0;
			}

			if (must == -1 && d[p] > d[i])
				must = p;
			if (must != -1 && d[p] > d[i] && d[must] > d[p])
				must = p;
		}

		if (must != -1 && !(bitset & (1 << must)))
			return 0;
	}
	return 1;
}

int main()
{
	fscanf(fin, "%d", &n);

	for (int i = 0; i < n - 1; i++)
	{
		fscanf(fin, "%d %d", &x[i], &y[i]);
		x[i] --;
		y[i] --;
	}

	for (int i = 0; i < n; i++)
		fscanf(fin, "%d", &d[i]);

	for (int i = 0; i < n; i++)
		t[i] = -2;

	int nrt = 1;
	t[0] = -1;

	while (nrt < n)
	{
		for (int i = 0; i < n - 1; i++)
		{
			if (t[x[i]] != -2)
			{
				if (t[y[i]] == -2)
				{
					t[y[i]] = x[i];
					nrt++;
				}
			}
			else if (t[y[i]] != -2)
			{
				if (t[x[i]] == -2)
				{
					t[x[i]] = y[i];
					nrt++;
				}
			}
		}
	}

	int nrmax = 0;
	for (int i = 0; i < (1 << n); i++)
	{
		if (ok(i))
		{
			int nr = 0;
			for (int j = 0; j < n; j++)
				if (i & (1 << j))
					nr++;
			
			if (nrmax < nr)
				nrmax = nr;
		}
	}

	fprintf(fout, "%d\n", nrmax);

	fclose(fin);
	fclose(fout);

	return 0;
}