Pagini recente » Cod sursa (job #1887172) | Cod sursa (job #24704) | Cod sursa (job #3155103) | Cod sursa (job #1453021) | Cod sursa (job #2379020)
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fi("guvern.in");
ofstream fo("guvern.out");
int n,rez,i,x,y,Coop[200005],Fiu[200005],Dp[200005],Val[200005];
vector<int> A[200005],First[200005];
set<pair<int,int> > S;
void dfs(int nod, int p)
{
vector<int>::iterator it;
int coresp=(*S.lower_bound({Coop[nod],0})).second;
if(!Fiu[coresp])
{
First[coresp].push_back(nod);
Fiu[coresp]=nod;
}
S.insert({Coop[nod],nod});
for(it=A[nod].begin(); it!=A[nod].end(); it++)
if((*it)!=p)
dfs(*it,nod);
for(it=First[nod].begin(); it!=First[nod].end(); it++)
Dp[nod]=Dp[nod]+Val[*it];
Dp[nod]++;
rez=max(rez,Dp[nod]);
Val[Fiu[coresp]]=max(Val[Fiu[coresp]],Dp[nod]);
S.erase({Coop[nod],nod});
if(Fiu[coresp]==nod)
Fiu[coresp]=0;
}
int main()
{
fi>>n;
for(i=1; i<n; i++)
{
fi>>x>>y;
A[x].push_back(y);
A[y].push_back(x);
}
for(i=1; i<=n; i++)
fi>>Coop[i];
dfs(1,0);
fo<<rez<<"\n";
fi.close();
fo.close();
return 0;
}