记录编号 58044 评测结果 AAAAAAAAAA
题目名称 计划 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.027 s
提交时间 2013-04-16 16:26:29 内存使用 2.81 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<cstring>
#include<iomanip>
#include<stack>
#include<cmath>
using namespace std;
//注意:先预处理a,b,c的s和l
const int SIZEL=501,SIZEN=1001;
class HP{
public:
	int s[SIZEL];//数
	int l;//长度,不是指针
	void clear(void){
		int i;
		for(i=0;i<SIZEL;i++) s[i]=0;
		l=0;
	}
	HP(){clear();}
	void outint(void){//调代码用蛤蛤蛤
		int i;
		//cout<<l<<":";
		for(i=l-1;i>=0;i--) cout<<s[i];
		cout<<endl;
	}
};
HP operator * (HP a,int b){//a*b
	int i;
	for(i=0;i<a.l;i++) a.s[i]*=b;
	for(i=0;i<a.l||a.s[i]!=0;i++){
		a.s[i+1]+=a.s[i]/10;
		a.s[i]%=10;
	}
	a.l=a.l>i?a.l:i;
	while(!a.s[a.l-1]) a.l--;
	//a.outint();
	return a;
}
class NODE{
public:
	bool bar;//是否是p区域
	int t;//到达需时
	deque<int> c;//邻接表
	int deg;
	bool reachable;
	HP p;//概率
	bool undeg;
	NODE(){undeg=true,bar=reachable=false,t=deg=0,c.clear();}
};
NODE area[SIZEN];
bool visit[SIZEN]={0};
int n,m,k;//m为物资数,k为贫瘠区域的数目
//节点下标是1~n
#define now area[x]
HP nowp;
void DFS(int timer,int x){
	//cout<<timer<<" "<<x<<" "<<endl;
	//cout<<x<<endl;
	visit[x]=true;
	now.t=timer;
	now.reachable=(now.t<=m);
	if(!now.reachable){
		return;
	}
	int temp,i;
	bool flag;
	//cout<<x<<endl;
	flag=true,i=temp=0;
	now.p=nowp;
	temp=now.c.size();
	for(i=0;i<temp;i++){
		if(visit[now.c[i]])	continue;
		flag=false;
		nowp=now.p*now.deg;
		if(now.bar)	DFS(timer+2,now.c[i]);
		else{
			DFS(timer+1,now.c[i]);
		}
	}
	now.undeg=flag;
}
int cmp(NODE a,NODE b){//a>b:1,a=b:0,a<b:-1
	if(!a.reachable&&!b.reachable) return 0;
	if(!a.reachable) return 1;
	if(!b.reachable) return -1;
	if(a.p.l>b.p.l) return 1;
	if(a.p.l<b.p.l) return -1;
	int i=a.p.l-1;
	while(i&&a.p.s[i]==b.p.s[i]) i--;
	if(!i) return 0;
	if(a.p.s[i]>b.p.s[i]) return 1;
	if(a.p.s[i]<b.p.s[i]) return -1;
}
void read(void){
	scanf("%d%d%d",&n,&m,&k);
	int i,temp,a,b;
	for(i=1;i<=k;i++){
		scanf("%d",&temp);
		area[temp].bar=true;
	}
	for(i=1;i<=n-1;i++){
		scanf("%d%d",&a,&b);
		area[a].c.push_back(b);
		area[b].c.push_back(a);
	}
	area[1].deg=area[1].c.size();
	for(i=2;i<=n;i++) area[i].deg=area[i].c.size()-1;
}
void work(void){
	nowp.l=1,nowp.s[0]=1;
	DFS(0,1);
	int i;
	int max,min;
	max=min=-1;
	max=min=-1;
	for(i=1;i<=n;i++){
		if(!area[i].undeg) continue;
		if(max==-1)	max=i;
		else if(cmp(area[max],area[i])==1) max=i;
		if(min==-1)	min=i;
		else if(cmp(area[min],area[i])==-1) min=i;
	}
	printf("%d\n%d\n",min,max);
}
int main(){
	freopen("plan.in","r",stdin);
	freopen("plan.out","w",stdout);
	read();
	work();
	return 0;
}