链接:点击打开链接
题意:在一棵树中,找出一个集合并将集合中的数按权值排序使得相邻两个数所代表的节点的路径上的节点的权值都小于这两个节点
代码:
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int id,val;
friend bool operator<(node a,node b){
return a.val>b.val;
}
}s[500005];
int dp[500005],va[500005];
vector<int> G[500005];
int main(){ //其实就是找一个最小的节点沿着
int n,i,j,u,v,ans,cnt,tmp; //点的权值递增有多少个节点
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++){
G[i].clear();
scanf("%d",&s[i].val);
va[i]=s[i].val;
s[i].id=i;
}
sort(s+1,s+n+1);
for(i=0;i<n-1;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
ans=0;
for(i=1;i<=n;i++){ //沿着点权值增加进行dp
cnt=s[i].id;
dp[cnt]=1;
for(j=0;j<G[cnt].size();j++){
tmp=G[cnt][j];
if(va[tmp]>va[cnt])
dp[cnt]+=dp[tmp];
}
ans=max(ans,dp[cnt]);
}
printf("%d\n",ans);
}
return 0;
}