1 solutions
-
1
dfs搜索各子树再找最大值即可
#include<bits/stdc++.h> using namespace std; int n; int a[16005]={};//点权值 vector<int> p[16005]={};//存一个点的相邻点 int ans=-0x3f3f3f3f;//一定要开到接近负无穷,不然100wa //dfs搜索各子树的总权值 int dfs(int u,int fa){//当前点 它的父节点 int num=a[u];//存该子树的权值和 for(int i=0;i<p[u].size();i++){ int v=p[u][i];//下一个 if(v==fa) continue;//走回头路了 int s=dfs(v,u); if(s<=0) continue;//小了,不要 num+=s; } ans=max(ans,num);//记录最大值 return num; } signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++){ int x,y; cin>>x>>y; p[x].push_back(y); p[y].push_back(x);//添加边 } dfs(1,0);//随便一个点开始遍历 cout<<ans<<"\n"; }
- 1
Information
- ID
- 390
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 6
- Tags
- # Submissions
- 46
- Accepted
- 15
- Uploaded By