P1122 最大子樹和

2022-07-21 05:27:10 字數 1345 閱讀 8551

小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題:

一株奇怪的花卉,上面共連有nn朵花,共有n-1n−1條枝幹將花兒連在一起,並且未修剪時每朵花都不是孤立的。每朵花都有乙個「美麗指數」,該數越大說明這朵花越漂亮,也有「美麗指數」為負數的,說明這朵花看著都讓人噁心。所謂「修剪」,意為:去掉其中的一條枝條,這樣一株花就成了兩株,扔掉其中一株。經過一系列「修剪「之後,還剩下最後一株花(也可能是一朵)。老師的任務就是:通過一系列「修剪」(也可以什麼「修剪」都不進行),使剩下的那株(那朵)花卉上所有花朵的「美麗指數」之和最大。

老師想了一會兒,給出了正解。小明見問題被輕易攻破,相當不爽,於是又拿來問你。

第一行乙個整數n(1 ≤ n ≤ 16000)n(1≤n≤16000)。表示原始的那株花卉上共nn朵花。

第二行有nn個整數,第ii個整數表示第ii朵花的美麗指數。

接下來n-1n−1行每行兩個整數a,ba,b,表示存在一條連線第aa 朵花和第bb朵花的枝條。

乙個數,表示一系列「修剪」之後所能得到的「美麗指數」之和的最大值。保證絕對值不超過21474836472147483647。

輸入 #1複製

7

-1 -1 -1 1 1 1 0

1 42 5

3 64 7

5 76 7

輸出 #1複製

3

【資料規模與約定】

對於60\%60%的資料,有n≤1000n≤1000;

對於100\%100%的資料,有n≤16000n≤16000。

問題分析:給定一棵帶點權的樹,求出最大的子樹和。

#include

#include

#define maxn 17000

using namespace std;

int ans=-1200120;

inline int max(int x,int y)

inline int read()

struct nodee[maxn*2];

int head[maxn*2],num;

void addedge(int from,int to)

int f[maxn],n,m,val[maxn];

void dfs(int u,int fa)

}ans=max(ans,f[u]);

}int main()

dfs(1,0);

printf("%d",ans);

return 0;

}

P1122 最大子樹和 題解

同步 原題鏈結 簡要題意 給定一棵 n nn 個節點的樹,有點權,求其中最大的連通塊之和。資料範圍 n 1.6 1 04 n leq 1.6 times 10 4 n 1.6 104.很顯然,考慮用樹形 dp text dp 解決此題。f uf u fu 表示以 u uu 為根的子樹中包含 u uu...

P1122 最大子樹和 題解

csdn同步 原題鏈結 簡要題意 給定一棵 n 個節點的樹,有點權,求其中最大的連通塊之和。資料範圍 n leq 1.6 times 10 4 很顯然,考慮用樹形 text 解決此題。f u 表示以 u 為根的子樹中包含 u 節點的答案。則易得 f u a u max u max f v 0 時間複...

P1122 最大子樹和 (樹形DP)

第一次寫樹形dp,找了乙個簡單的題,先熟悉一下套路,雖然自己的這種寫法,過了,可以求到最大的子樹和,但是不能求到每個結點的最大子樹和,只有某一部分的最大子樹和的根,它是正確的,其他結點都是打工仔。遞迴下去,以子樹推當前結點和子樹的最優值,是可以辦到的 情況1 如果當前子樹 0,就不更新 情況2 如果...