比赛 20160415x 评测结果 TTTTTTTTTT
题目名称 游戏内测 最终得分 0
用户昵称 sro dydxh orz 运行时间 10.005 s
代码语言 C++ 内存使用 9.30 MiB
提交时间 2016-04-15 16:21:11
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
const int maxn=500000;
int n,p[maxn+10],ans=0,tim=1,num=1;
int lnum=0;
bool typ[maxn+10];
struct edge{
	int y,next;
}e[maxn+10];
int lin[maxn+10],len;
void insert(int a,int b){
	e[++len].next=lin[a];
	lin[a]=len;
	e[len].y=b;
}
void work(int k){
	int temp=-1,tp=0,tp2=0;
	for(int i=lin[k];i;i=e[i].next){
		int yy=e[i].y;
		if(p[yy]>temp){
			temp=p[yy];
			tp=yy;
			if(!typ[yy])	tp2=yy;
		}
	}
	//cout<<k<<' '<<tp<<' '<<tp2<<endl;
	tim++;
	if(tp2!=0){
		typ[tp2]=1;num++;
		if(tim+p[tp2]>ans)
			ans=tim+p[tp2];
		if(num==n){
			lnum=tp2;
			return;
		}	
		else work(tp2);
	}
	else if(typ[tp]&&tp2==0){
		if(ans<tim)	ans++;
		work(tp);
	}
}
int q[500100],head=0,tail=0,hah=0;
void minroad(int n){
	q[++tail]=n;
	while(head<tail){
		int poi=q[++head];
		bool ll=0;
		hah++;
		for(int i=lin[poi];i;i=e[i].next){
			q[++tail]=e[i].y;
			if(e[i].y==1){
				ll=1;break;
			}
		}
		if(ll)	return;
	}
}
int main(){
	freopen("gamebeta.in","r",stdin);
	freopen("gamebeta.out","w",stdout);
	
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&p[i]);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		insert(a,b);
		insert(b,a);
	}
	work(1);
	//cout<<lnum<<endl;
	minroad(lnum);
	int outp=min(tim+hah+p[1],ans);
	cout<<outp<<endl;
	return 0;
}