标签:真题 int max LL 子树中 dfs 蓝桥 之树 权值
最大子段和的树上扩展。
状态表示:
\(f[u]\):在以\(u\)为根的子树中包含u的所有连通块中的权值的最大值。
状态转移:
如果子树中存在权值和为正的连通块,则包含上该子树,否则丢弃。
\(s_1,s_2,\cdots,s_k\)是\(u\)的孩子。
const int N=1e5+10;
vector<int> g[N];
LL f[N];
int w[N];
int n;
void dfs(int u,int fa)
{
f[u]=w[u];
for(int i=0;i<g[u].size();i++)
{
int j=g[u][i];
if(j == fa) continue;
dfs(j,u);
f[u]+=max(0LL,f[j]);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
g[a].pb(b);
g[b].pb(a);
}
dfs(1,-1);
LL res=0;
for(int i=1;i<=n;i++)
res=max(res,f[i]);
cout<<res<<endl;
//system("pause");
return 0;
}
标签:真题,int,max,LL,子树中,dfs,蓝桥,之树,权值 来源: https://www.cnblogs.com/fxh0707/p/14643003.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。