标签:
按照升序或者降序选择的点集可以满足条件.....
树上的每个节点可以从子节点转移,也可以从父亲节点转移
7 3 30 350 100 200 300 400 1 2 2 3 3 4 4 5 5 6 6 7
5
/* *********************************************** Author :CKboss Created Time :2015年07月28日 星期二 16时28分41秒 File Name :1010.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int INF=0x3f3f3f3f; const int maxn=500500; int n; int f[maxn]; int w[maxn]; struct Edge { int to,next; }edge[maxn*2]; int Adj[maxn],Size; int dp[maxn]; void init() { memset(Adj,-1,sizeof(Adj)); Size=0; } void Add_Edge(int u,int v) { edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++; } void dfs(int u,int fa) { f[u]=fa; dp[u]=1; for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; if(v==fa) continue; dfs(v,u); if(w[u]<w[v]) dp[u]+=dp[v]; } } int up[maxn]; bool used[maxn]; int dfs_fa(int u) { if(used[u]==true) return up[u]; used[u]=true; int v=f[u]; if(w[v]>w[u]) { up[u]=dp[v]+dfs_fa(v); } return up[u]; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n)!=EOF) { init(); memset(dp,0,sizeof(dp)); memset(up,0,sizeof(up)); memset(f,0,sizeof(f)); memset(used,false,sizeof(used)); used[0]=true; for(int i=1;i<=n;i++) { scanf("%d",w+i); //Add_Edge(0,i); } w[0]=INF; for(int i=0,u,v;i<n-1;i++) { scanf("%d%d",&u,&v); Add_Edge(u,v); Add_Edge(v,u); } dfs(1,0); int ans=0; for(int i=1;i<=n;i++) { ans=max(ans,dp[i]+dfs_fa(i)); } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/47111199