Pagini recente » Cod sursa (job #1435024) | Cod sursa (job #2352515) | Cod sursa (job #968182) | Cod sursa (job #68350) | Cod sursa (job #586255)
Cod sursa(job #586255)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
typedef vector<int> :: iterator it;
ifstream f("guvern.in");
ofstream g("guvern.out");
int N;
int c[200001];
long long up[200001];
int act_dad[200001]; // tatal necesar
int dad[200001]; // tatal efectiv
vector<int>arb[200001]; // arborele
queue<int>q;
void make_father()
{ int x;
dad[1] = -1;
q.push(1);
while(!q.empty())
{ x = q.front(); q.pop();
for(it i = arb[x].begin(); i != arb[x].end(); i++)
if(*i != dad[x]) dad[*i] = x , q.push(*i);
}
}
void sch(int x,int &minim,int y,int &poz)
{ while(x != 1)
{ if(y <= c[x])
{ if(minim > c[x]) minim = c[x] , poz = x;
}
x = dad[x];
}
}
int main()
{ int i,x,y;
int minim,poz,mx;
f>>N;
for(i = 1; i < N; i++)
{ f>>x>>y;
arb[x].push_back(y); arb[y].push_back(x);
}
for(i = 1; i <= N; i++)
f>>c[i];
make_father(); up[1] = 1; act_dad[1] = -1;
for(i = 2; i <= N; i++)
{ minim = 2000000000; poz = -1;
sch(dad[i],minim,c[i],poz);
if(minim == 2000000000) act_dad[i] = -1;
else act_dad[i] = poz;
}
q.push(1);
while(!q.empty())
{ x = q.front(); q.pop();
for(it k = arb[x].begin(); k != arb[x].end(); k++)
{ if(*k == dad[x]) continue;
q.push(*k);
if(act_dad[*k] == -1) up[*k] = 1;
else
up[*k] = 1 + up[act_dad[*k]];
}
}
for(mx = -1 , i = 1; i <= N; i++)
if(mx < up[i]) mx = up[i];
g<<mx;
f.close();
g.close();
return 0;
}