3009 - 没有上司的舞会
Ural 大学有 N 个职员,编号为 1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
Input
第一行一个整数 N。(1<=N<=6000)
接下来 N 行,第 i+1 行表示 i 号职员的快乐指数 Ri (-128<=Ri<=127)
接下来 N-1 行,每行输入一对整数 L,K。表示 K 是 L 的直接上司。
最后一行输入 0,0。
Output
输出最大的快乐指数。
Examples
Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
Output
5
Solution C++
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int n; bool b[6001]; int a[6001]; int ne;//总结点 int f[6001][2];//寻根 int hd[6001]; struct jiegouti{ int v; int next; }; struct jiegouti e[6001]; void so(int v,int u) { ne++; e[ne].v=v; e[ne].next=hd[u]; hd[u]=ne; } void dp(int u) { f[u][1]=a[u];//1是要,0是不要 f[u][0]=0; for(int i=hd[u];i!=0;i=e[i].next) { int v=e[i].v; dp(v); f[u][1]+=f[v][0]; f[u][0]=f[u][0]+max(f[v][1],f[v][0]); } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int l,k; while(cin>>l>>k&&l!=0&&k!=0) { b[l]=1; so(l,k); } for(int i=1;i<=n;i++) { if(b[i]==0) { dp(i); cout<<max(f[i][0],f[i][1]); break; } } return 0; }