Cod sursa(job #586275)

Utilizator rares192Preda Rares Mihai rares192 Data 30 aprilie 2011 14:20:40
Problema Guvern Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 0.99 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<bitset>
using namespace std;

ifstream fin("guvern.in");
ofstream fout("guvern.out");

int n;
int dif[200001];
int sol[200001];
vector<int > a[200001];
bool s[200001];
int t[200001];

void read();
void solve();
void DF(int );

int main()
{
	read();
	solve();
	return 0;
}

void read()
{
	fin >> n;
	
	int x, y;
	for(int i = 1; i < n; ++i)
		{
			fin >> x >> y;
			a[x].push_back(y);
			a[y].push_back(x);
			t[y] = x;
		}
	
	for(int i = 1; i <= n; ++i)
		fin >> dif[i], sol[i] = 1;
	
	fin.close();
}

void solve()
{
	int root;
	for(int i = 1; i <= n; ++i)
		if(t[i] == 0) 
		{ root = i;
		  break;
		}
		
	DF(root);
	fout << ( *max_element(sol+1, sol+n+1) );
}

void DF(int x)
{
	s[x] = 1;
	
	for(unsigned int i = 0; i < a[x].size(); ++i)
	{
		int y = a[x][i];
		if( !s[y] )
		{
			s[y] = 1;
			DF( y );
			if( dif[x] > dif[y]) 
				sol[x] = max(sol[y] + 1, sol[x]);
		}
	}
}