The Weight of Tree

来源:互联网 发布:增发纤维 知乎 编辑:程序博客网 时间:2024/06/07 02:08

http://acm.nyist.net/JudgeOnline/problem.php?pid=697

这是我们比赛一道题,当时不会做

说是给你n个节点的树,每个节点都有个权值,让你求出个子树的权值最大,树形dp,让我觉得只是道搜索

 #include<stdio.h>#include<algorithm>#include<cstring>#include<iostream>using namespace std;#define MAXN  100006int dp[MAXN];bool  B[MAXN];int top;typedef struct{    int v;    int next;}Edge;typedef struct{    int head;}Head;Head H[MAXN];Edge E[MAXN];void Add_Edge(int u,int v){    E[top].v=v;    E[top].next=H[u].head;    H[u].head=top;    top++;}void Read_Graph(int n){    int u,v;    for(int i=1;i<n;i++){        cin>>u>>v;        Add_Edge(u,v);        Add_Edge(v,u);    }    return ;}void dfs(int u){    B[u]=true;    for(int i=H[u].head;i!=-1;i=E[i].next){        int j=E[i].v;        if(!B[j]){            dfs(j);            if(dp[j]>0)            dp[u]+=dp[j];        }    }}int main(){    int ncase;    cin>>ncase;    while(ncase--){        memset(B,false,sizeof(B));        memset(H,-1,sizeof(H));        top=0;        int n;        cin>>n;        for(int i=1;i<=n;i++)        cin>>dp[i];        Read_Graph(n);        dfs(1);        int Max=dp[1];        for(int i=2;i<=n;i++)        Max=max(Max,dp[i]);        cout<<Max<<endl;    }    return 0;}