Pagini recente » Cod sursa (job #1556955) | Cod sursa (job #1759418) | Cod sursa (job #466471) | Cod sursa (job #1224981) | Cod sursa (job #2230575)
#include <fstream>
#include <vector>
#include <stack>
#include <set>
using namespace std;
ifstream in("guvern.in");
ofstream out("guvern.out");
const int NMAX = 1e3 + 1e2;
const int INF = 1 << 31;
int n, x, y;
int res;
int dp[NMAX], val[NMAX];
bool fst[NMAX];
vector < int > v[NMAX];
vector < int > w[NMAX][2];
stack < int, vector < int > > son[NMAX];
set < pair < int , int > > q;
int src(int node, int s) {
int cur = 0;
for(int i = 0; i < (int)w[node][s].size(); i++)
cur += src(w[node][s][i], 0);
return max(dp[node], cur);
}
void dfs(int node) {
fst[node] = 1;
set < pair < int, int > > :: iterator it = q.upper_bound(make_pair(val[node], 0));
if(son[it->second].size() == 0)
w[it->second][1].push_back(node);
else
w[son[it->second].top()][0].push_back(node);
son[it->second].push(node);
q.insert(make_pair(val[node], node));
for(int i = 0; i < v[node].size(); i++)
if(!fst[v[node][i] ])
dfs(v[node][i]);
q.erase(make_pair(val[node], node));
son[it->second].pop();
dp[node] = src(node, 1) + 1;
}
int main()
{
in >> n;
for(int i = 1; i < n; i++) {
int x, y;
in >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i = 1; i <= n; i++)
in >> val[i];
val[0] = INF;
v[0].push_back(1);
v[1].push_back(0);
dfs(0);
out << dp[0] - 1 << '\n';
in.close();
out.close();
return 0;
}