最大子树和(遇到的题)

本文介绍了如何通过C++编程解决一个关于给定无向树的问题,即找到以任意节点为根时的最大权值块。利用深度优先搜索(DFS)算法更新dp数组,最终输出整个树中最大权值块的值。
摘要由CSDN通过智能技术生成

题目是给出一个树,求其中最大的权值块

题解:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+9;			
int dp[N];		//dp[i]表示第i结点为根最大权值 
int w[N];			//记录每个结点的权值 
int n;				//点的数量 
int t;				//样例个数 
vector<int>g[N];			//邻接表(保留每个结点的出度) 
void dfs(int x,int pre){			//dfs深度搜索,x为当前根,pre为其“父亲” 
	dp[x]=w[x];				//把该结点的权值先赋值给dp[x] 
	for(auto &y:g[x]){			//遍历该结点的出度 
		if(y==pre)	continue;			//如果该结点的出度为其父亲,则跳过(本就是以x为父亲到y,不能再把y当做x的父亲去搜搜 
		dfs(y,x);					//搜索以y为结点,x是y的父亲 
		dp[x]=max(dp[x],dp[x]+dp[y]);			//取(当前权值和当前权值+以儿子为根权值)的最大值 
	}
}
int main()
{	
	cin>>t;
	while(t--)
	{
		cin>>n;
	
		for(int i=1;i<=n;i++){
			cin>>w[i];				//输入权值 
		}
		for(int i=1;i<=n-1;i++){
			int u,v;			//读取两个结点 
			cin>>u>>v;
			g[u].push_back(v);		//因为是无向树,所以u的出度有v(无向树就当做二向树) 
			g[v].push_back(u); 		//因为是无向树,所以v的出度有u 
		}
	}
	dfs(1,-1);			//以1为根,-1为1的父亲开始搜索(以-1是为了保证dfs不被特殊情况跳出,因为-1根本不存在,不会被跳过) 
	cout<<*max_element(dp+1,dp+n+1)<<'\n';			//输出dp数组里面的最大值 
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值