[洛谷1122]最大子树和
思路:
随便定一个点为根,遍历整棵树,对于每个结点的每棵子树,若它的值为正,则加入到该结点中。特别地,叶子结点的值等于其权值。
1 #include<cstdio> 2 #include<cctype> 3 #include<vector> 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 const int N=16001; 12 int w[N],f[N]={0}; 13 std::vector<int> e[N]; 14 inline void add_edge(const int u,const int v) { 15 e[u].push_back(v); 16 e[v].push_back(u); 17 } 18 int ans=0; 19 void dfs(const int x,const int par) { 20 f[x]=w[x]; 21 for(unsigned i=0;i<e[x].size();i++) { 22 if(e[x][i]==par) continue; 23 dfs(e[x][i],x); 24 if(f[e[x][i]]>0) f[x]+=f[e[x][i]]; 25 } 26 ans=std::max(ans,f[x]); 27 } 28 int main() { 29 int n=getint(); 30 for(int i=1;i<=n;i++) scanf("%d",&w[i]); 31 for(int i=1;i<n;i++) add_edge(getint(),getint()); 32 dfs(1,0); 33 printf("%d\n",ans); 34 return 0; 35 }