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