记录编号 |
58044 |
评测结果 |
AAAAAAAAAA |
题目名称 |
计划 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}