Pagini recente » Cod sursa (job #2304621) | Cod sursa (job #797902) | Cod sursa (job #1981606) | Cod sursa (job #2176723) | Cod sursa (job #586163)
Cod sursa(job #586163)
#include<algorithm>
#include<stdio.h>
#include<vector>
#define pb push_back
using namespace std;
vector<int> g[202020],frun;
int tata[202020],x,y,N;
int viz[202020];
int minim[202020];
int ind[202020],was[101010],was2[101010];
int nr[202020];
int maxi[10100],maxim1,ok;
int qp;
void df(int x)
{
viz[x]=1;
for(int i=0;i<g[x].size();++i)
{
if(!viz[g[x][i]])
{
tata[g[x][i]]=x;
df(g[x][i]);
}
}
}
inline void calc(int x)
{
minim[x]=123456789;
int p=tata[x];
while(p!=0)
{
if(nr[p]>nr[x])
{
if(minim[x]>nr[p])
{
minim[x]=nr[p];
ind[x]=p;
}
}
p=tata[p];
}
}
void df2(int x)
{
was2[x]=1;
int p=ind[x];
while(p!=0)
{
was2[p]=1;
p=ind[p];
}
}
void ver(int x)
{
if(was2[x]==1)
{
maxi[x]=nr[x];
}
viz[x]=1;
for(int i=0;i<g[x].size();++i)
{
if(!viz[g[x][i]])
{
ver(g[x][i]);
if(was2[x])
{
if(maxi[g[x][i]]>nr[x])
ok=0;
}
}
}
}
void back(int k)
{
if(k==frun.size()+1)
{
if(qp)
{
for(int i=1;i<=N;++i)
{
was2[i]=0;
viz[i]=0;
}
for(int i=1;i<=N;++i)
maxi[i]=0;
for(int i=0;i<frun.size();++i)
if(was[i])
{
df2(frun[i]);
}
ok=1;
ver(1);
if(ok)
{int rez=0;
for(int i=1;i<=N;++i)
if(was2[i])
{
++rez;
}
maxim1=max(maxim1,rez);
}
}
}else{
++qp;
was[k-1]=1;
back(k+1);
--qp;
was[k-1]=0;
back(k+1);
}
return;
}
int main()
{
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<N;++i)
{
scanf("%d%d",&x,&y);
g[x].pb(y);
g[y].pb(x);
}
df(1);
for(int i=1;i<=N;++i)
scanf("%d",&nr[i]);
for(int i=1;i<=N;++i)
{
calc(i);
}
for(int i=1;i<=N;++i)
{
viz[ind[i]]=0;
}
for(int i=1;i<=N;++i)
{
if(viz[i])
frun.pb(i);
}
back(1);
printf("%d ",maxim1);
}