Pagini recente » Cod sursa (job #2519245) | Cod sursa (job #2371700) | Cod sursa (job #2524258) | Cod sursa (job #430713) | Cod sursa (job #2367679)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
ifstream fin("guvern.in");
ofstream fout("guvern.out");
vector< vector<int> > G;
int n;
vector<int> val;
vector<int> rang;
vector<int> len;
vector<int> g;
void bfs()
{
rang = vector<int>(n+1, 0);
queue<int> q;
q.push(1);
rang[1]=1;
while(!q.empty())
{
int here = q.front();
for(int v : G[here])
{
if(rang[v]==0)
{
q.push(v);
rang[v]=rang[here]+1;
}
}
q.pop();
}
}
bool cmp(int a, int b)
{
if(rang[a]<rang[b])
return true;
return false;
}
int maxi(int a, int b)
{
return ((a>b)?a:b);
}
int main()
{
fin>>n;
val = vector<int>(n+1);
G = vector<vector<int> >(n+1);
for(int i=0;i<n-1;i++)
{
int x,y;
fin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1;i<=n;i++)
fin>>val[i];
bfs();
g = vector<int>(n);
for(int i=0;i<n;i++)
g[i]=i+1;
sort(g.begin(), g.end(), cmp);
len = vector<int>(n+1, 1);
for(int i=1; i<n;i++)
{
int mini=0;
int minval=0x3f3f3f3f;
for(int j=0; j<i;j++)
{
if(rang[g[j]]<rang[g[i]] && val[g[j]]>val[g[i]])
{
if(val[g[j]]<minval)
{
mini = j;
minval=val[g[j]];
}
len[g[i]]=maxi(len[g[mini]]+1, len[g[i]]);
}
}
}
int maxx = 0;
for(int x : g)
{
if(len[x]>maxx)
maxx=len[x];
}
fout<<maxx;
return 0;
}