比赛 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;
}
// 但好像还是有点小问题 (真的尽力了