1380 没有上司的舞会
2014-08-18 20:09
225 查看
题目描述 Description
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
输入描述 Input Description
第一行一个整数N。(1<=N<=6000)接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
输出描述 Output Description
输出最大的快乐指数。
样例输入 Sample Input
71
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
样例输出 Sample Output
5#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int n,w[6001],ne=0;//ne为总边数 bool in[6001];//用来寻找根节点 int f[6001][2]; int hd[6001]; struct data{ int v,next; }e[6001]; void insert(int v,int u)//插入一条边 { ne++; e[ne].v=v; e[ne].next=hd[u]; hd[u]=ne; } void dp(int u) { f[u][1]=w[u];//1表示取,0表示不取 f[u][0]=0; for(int p=hd[u];p!=0;p=e[p].next) { int v=e[p].v; dp(v); f[u][1]+=f[v][0]; f[u][0]=f[u][0]+max(f[v][1],f[v][0]);//转移方程 } } int main() { scanf("%d",&n); int l,k; for(int i=1;i<=n;i++) scanf("%d",&w[i]); while(scanf("%d%d",&l,&k)!=EOF) { if(l==0&&k==0)break; in[l]=1; insert(l,k); } for(int i=1;i<=n;i++) if(!in[i]) { dp(i); printf("%d\n",max(f[i][0],f[i][1])); break; } return 0; }
相关文章推荐
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
- codevs 1380 没有上司的舞会(树形dp)
- codevs 1380 没有上司的舞会 树形DP
- Codevs 1380 没有上司的舞会
- codevs1380 没有上司的舞会
- 1380 没有上司的舞会
- codevs 1380 没有上司的舞会
- Codevs1380 没有上司的舞会
- 【codevs1380】没有上司的舞会 树形dp经典题目
- CODEVS 1380没有上司的舞会
- CodeVS1380 没有上司的舞会 解题报告【树形DP】
- wikioi 1380 没有上司的舞会 树形dp
- codevs1380没有上司的舞会
- codevs 1380 没有上司的舞会|树形动规
- 【codevs1380】没有上司的舞会 树形dp
- codevs1380 没有上司的舞会
- 【codevs 1380】没有上司的舞会(树形dp)
- Codevs 1380 没有上司的舞会 [树形dp]
- codevs 1380 没有上司的舞会 DP 解题报告
- 【洛谷 P1352】【codevs1380】没有上司的舞会