ftgjrtj

#include<bits/stdc++.h>
using namespace std;
int a[6007],h[6007],ne[6007],to[6007],fx[6007][2];
bool p[6007];
void f(int x)
{
    if(h[x]==0)
    {
        fx[x][1]=a[x];
        fx[x][0]=0;
        return ;
    }
    int s1=0,s2=a[x];
    int r1,r2;
    for(int i=h[x];i;i=ne[i])
    {
        f(to[i]);
        fx[x][1]+=fx[to[i]][0];
        fx[x][0]+=max(fx[to[i]][0],fx[to[i]][1]);
    }
    fx[x][1]+=a[x];
    return ;
}
int main()
{
    memset(p,0,sizeof(p));
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    int x,y;
    int tt=0;
    for(int i=1;i<=n-1;++i)
    {
        scanf("%d%d",&x,&y);
        p[x]=1;
        ++tt;
        ne[tt]=h[y];
        h[y]=tt;
        to[tt]=x;
    }
    int k;
    for(k=1;k<=n;++k)
      if(p[k]==0)  break;
    //cout<<k;
    f(k);
    cout<<max(fx[k][1],fx[k][0]);
    return 0;
}

 

上一篇:树剖模板(洛谷3384)


下一篇:关于量词的一个问题