Pagini recente » Cod sursa (job #1952403) | Cod sursa (job #835023) | Cod sursa (job #1319023) | Rating Nazare Ana-Karina (Karina.Nazare) | Cod sursa (job #586298)
Cod sursa(job #586298)
#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;
}