题目是给出一个树,求其中最大的权值块
题解:
#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;
}