CODEVS1380 没有上司的舞会 (easy)

题目描述 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

输出最大的快乐指数。


(从框框里出不去了。crying。。。)


思路:树形dp(应该算是吧。。。)。二维数组k【i】【0】(表示不取i结点),k【i】【1】(表示取i点)。用了美丽的next数组保存边之间的关系。。。希望提高了效率。


code:

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int r[6001]={0},f[6001][2]={0},fa[6001]={0},next[6001]={0},point[6001]={0},ans;

void work(int x)

{

int i,p; 

p=point[x];

if (p==0) 

{

f[x][0]=0;

f[x][1]=r[x];

if (f[x][1]>ans) ans=f[x][1];

return;

}

while (p!=0)

{

work(p);

f[x][0]=max(f[x][0],f[p][1]+f[x][0]);

f[x][1]=max(f[x][1],f[p][0]+f[x][1]);

p=next[p];

}

if (r[x]>0)

  f[x][1]=f[x][1]+r[x];

if (f[x][0]>ans) ans=f[x][0];

if (f[x][1]>ans) ans=f[x][1];

}

int main()

{

int n,i,j,l,k;

cin>>n;

ans=-2100000000;

for (i=1;i<=n;++i)

  cin>>r[i];

for (i=1;i<n;++i)

{

cin>>l>>k;

fa[l]=k;

    next[l]=point[k];

    point[k]=l;

}

cin>>l>>k;

for (i=1;i<=n;++i)

  if (fa[i]==0)

  {

    work(i);

    cout<<ans<<endl;

    break;

  }

你可能感兴趣的:(code)