Pagini recente » Cod sursa (job #2769120) | Cod sursa (job #317257) | Cod sursa (job #1770220) | Cod sursa (job #2167626) | Cod sursa (job #1165266)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
#define NMAX 200005
#define pi pair<int,int>
#define x first
#define y second
#define mp make_pair
#define pb push_back
int grad[NMAX],viz[NMAX],sfarsit[NMAX],trecut[NMAX];
int nrp,nr,d[NMAX][2],sol,n,smax;
class cmp
{
public:
bool operator()(const int& a, const int& b)
{
return grad[a] < grad[b];
}
};
set<int,cmp> myset;
set<int,cmp> ::iterator it;
pi perechi[2 * NMAX];
vector<int> v[NMAX],go[NMAX];
inline int cmp2(const pi& a,const pi& b)
{
if(a.x == b.x)
viz[a.y] > viz[b.y];
return a.x < b.x;
}
inline void dfs(int nod)
{
it = myset.lower_bound(nod);
if(it != myset.end())
{
int val = *it;
// printf("%d devine tatic la %d\n",val,nod);
go[val].pb(nod);
}
viz[nod] = 1;
myset.insert(nod);
int i,vec,lim = v[nod].size();
for(i = 0; i < lim; i++)
if(!viz[vec = v[nod][i]])
dfs(vec);
myset.erase(nod);
}
inline void dfs2(int nod)
{
//printf("Nodul %d\n",nod);
int i,vec,lim = v[nod].size();
pi p;
viz[nod] = ++nr;
for(i = 0; i < lim; i++)
if(!viz[vec = v[nod][i]])
{
dfs2(vec);
d[nod][0] += max(d[vec][0],d[vec][1]);
}
sfarsit[nod] = nr;
lim = go[nod].size();
nrp = 0;
for(i = 0; i < lim; i++)
{
vec = go[nod][i];
perechi[++nrp] = mp(viz[vec],vec);
perechi[++nrp] = mp(sfarsit[vec],vec);
}
sort(perechi + 1,perechi + nrp + 1,cmp2);
smax = 1;
for(i = 1; i <= nrp; i++)
{
p = perechi[i];
if(!trecut[p.y])
trecut[p.y] = smax;
else
smax = max(smax,trecut[p.y] + 1);
}
d[nod][1] = smax;
}
int main ()
{
int i,a,b;
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
scanf("%d",&n);
for(i = 1; i < n; i++)
{
scanf("%d%d",&a,&b);
v[a].pb(b);
v[b].pb(a);
}
for(i = 1; i <= n; i++)
scanf("%d",&grad[i]);
dfs(1);
memset(viz,0,sizeof(viz));
dfs2(1);
sol = max(d[1][0],d[1][1]);
printf("%d\n",sol);
return 0;
}