1 solutions

  • 1
    @ 2025-7-11 16:59:05

    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