Pagini recente » Cod sursa (job #1757951) | Cod sursa (job #264550) | Cod sursa (job #1132184) | Cod sursa (job #445570) | Cod sursa (job #586312)
Cod sursa(job #586312)
#include <cstdio>
#include <vector>
#include <list>
#include <set>
using namespace std;
#define NMAX 200050
#define MOD 100057
int D[NMAX], TO[NMAX], C[NMAX], fii[NMAX], viz[NMAX], n, i, sol;
vector <int> G[NMAX], V[NMAX];
list < pair <int, int> > H1[MOD], H2[MOD];
set <int> S;
void adauga (int x, int nod) {
if (x >= 0) {
int t = x % MOD;
H1[t].push_back (make_pair (x, nod));
}
else {
x = -x; int t = x % MOD;
H2[t].push_back (make_pair (x, nod));
}
}
void citire () {
freopen ("guvern.in", "r", stdin);
int i, x, y;
scanf ("%d", &n);
for (i = 1; i <= n; i++) {
scanf ("%d %d", &x, &y);
G[x].push_back (y);
G[y].push_back (x);
}
for (i = 1; i <= n; i++) {
scanf ("%d", &C[i]);
adauga (C[i], i);
}
}
int cauta1 (int x) {
int t = x % MOD;
for (list < pair <int, int> >::iterator it = H1[t].begin (); it != H1[t].end (); it++)
if (it -> first == x) return it -> second;
return 0;
}
int cauta2 (int x) {
x = -x; int t = x % MOD;
for (list < pair <int, int> >::iterator it = H2[t].begin (); it != H2[t].end (); it++)
if (it -> first == x) return it -> second;
return 0;
}
void dfs1 (int nod) {
int x;
set <int>::iterator it2 = S.lower_bound (C[nod]);
if (C[nod] >= 0) x = cauta1 (*it2);
else x = cauta2 (*it2);
TO[nod] = x; D[x]++;
V[x].push_back (nod);
viz[nod] = 1; S.insert (C[nod]);
for (vector <int>::iterator it = G[nod].begin (); it != G[nod].end (); it++)
if (!viz[*it]) dfs1 (*it);
it2 = S.find (C[nod]); S.erase (it2);
}
void dfs2 (int nod) {
viz[nod] = 1; fii[nod] = 1;
for (vector <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
if (!viz[*it]) {
dfs1 (*it);
fii[nod] += fii[*it];
}
}
int main () {
citire ();
dfs1 (1);
for (i = 1; i <= n; i++) {
dfs2 (i);
if (fii[i] > sol) sol = fii[i];
}
printf ("%d", sol);
return 0;
}