Cod sursa(job #586255)

Utilizator andunhillMacarescu Sebastian andunhill Data 30 aprilie 2011 14:17:30
Problema Guvern Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.44 kb
#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;
}