RocksonLee's Blog
avatar
RocksonLee
2021-11-02 13:29:16
  • 本文总阅读量
查看原题

点击跳转

思路是直接开始递归找边,如果这个点与他的子边是负数,那么就不要了,否则就要他。以做到最大 用到双向存边,防止回传(TLE)

#include<bits/stdc++.h>
#define INF 0x7FFFFFFF
#define N 16100
using namespace std;
vector<int>q[N];
int temp1,temp2,f[N],r[N],ans=-INF,n;
void dp(int x,int dad)
{
    f[x]=r[x];
    for (int i = 0; i < q[x].size(); i++)
    {
        int y=q[x][i];
        if (y!=dad)
        {
            dp(y,x);
            if (f[y]>0)
            {
                f[x]+=f[y];
            }
        }
    }

}
int main()
{
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
        scanf("%d",&r[i]);
    for (int i = 1; i <= n-1; i++)
    {
        scanf("%d%d",&temp1,&temp2);
        q[temp1].push_back(temp2);
        q[temp2].push_back(temp1);
    }
    dp(1,0);
    for (int i = 1; i <= n; i++)
        ans=max(ans,f[i]);
    cout<<ans;
    return 0;
}
LG P1122 最大子树和
comment评论
Search
search