Pagini recente » Cod sursa (job #2703403) | Cod sursa (job #2136369) | Cod sursa (job #2780339) | Cod sursa (job #1174706) | Cod sursa (job #586112)
Cod sursa(job #586112)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define DN 200005
using namespace std;
typedef vector<int>::iterator it;
int lgm,val[DN],dp[DN],n;
vector<int> gr[DN],gf[DN],gt[DN];
bitset<DN> viz;
void build(int s) {
viz[s]=1;
for(it i=gr[s].begin(); i!=gr[s].end(); ++i) if(0==viz[*i]) {
gf[s].push_back(*i);
gt[*i].push_back(s);
build(*i);
}
}
void search(int s, int dest) {
//if(s==dest) return;
if(val[dest]<val[s] && dp[dest]<dp[s]+1) {
dp[dest]=dp[s]+1;
//cerr<<dest<<' '<<s<<' '<<dp[dest]<<'\n';
lgm=max(dp[dest],lgm);
}
for(it i=gt[s].begin(); i!=gt[s].end(); ++i) search(*i,dest);
}
void dfs(int s) {
dp[s]=1;
search(s,s);
for(it i=gf[s].begin(); i!=gf[s].end(); ++i) dfs(*i);
}
int main()
{
ifstream f("guvern.in");
ofstream g("guvern.out");
f>>n;
for(int i=1; i<n; ++i) {
int a,b;
f>>a>>b;
gr[a].push_back(b);
gr[b].push_back(a);
}
for(int i=1; i<=n; ++i) f>>val[i];
build(1);
viz&=0;
dp[1]=1;
for(it i=gf[1].begin(); i!=gf[1].end(); ++i) dfs(*i);
g<<lgm;
return 0;
}