比赛 |
CSP2023-J模拟赛 |
评测结果 |
WWWWTTTTTT |
题目名称 |
新建题目 |
最终得分 |
0 |
用户昵称 |
AeeE5x |
运行时间 |
6.000 s |
代码语言 |
C++ |
内存使用 |
33.21 MiB |
提交时间 |
2023-10-18 21:53:51 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int n,q1,q2;
bool map[2001][2001]={};
struct node{
int w;
int val;
int dp;
}lis[2001],ops[4000001]={};
int sum=0;
bool Edbs[2001]={};
void bfs(int x){
Edbs[x]=true;
for(int i=1;i<=n;i++){
if(map[x][i]==true&&Edbs[i]==false){
if(lis[x].dp<lis[i].dp){
if(lis[x].w<lis[i].w) sum++,bfs(i);
else bfs(i);
}else bfs(i);
}
}
Edbs[x]=false;
}
void dep(){
int head=0,tail=1;
bool Ed[2001]={};
ops[0].dp=0,ops[0].val=1,lis[1].dp=0,Ed[1]=true;
while(head<tail){
for(int i=1;i<=n;i++) if(map[ops[head].val][i]==true&&Ed[i]==false) lis[i].dp=ops[tail].dp=ops[head].dp+1,ops[tail++].val=i,Ed[i]=true;
head++;
}
}
int main(){
freopen("touch.in","r",stdin);
freopen("touch.out","w",stdout);
scanf("%d",&n);
for(int p=1;p<=n;p++) scanf("%d",&lis[p].w);
for(int p=1;p<n;p++) scanf("%d%d",&q1,&q2),map[q1][q2]=map[q2][q1]=true;
dep();
for(int i=1;i<=n;i++) bfs(i);
cout<<sum;
fclose(stdin);
fclose(stdout);
return 0;
}
// 但好像还是有点小问题 (真的尽力了