P1122 最大子樹和 題解

2021-10-09 12:41:47 字數 1509 閱讀 2332

同步

原題鏈結

簡要題意:

給定一棵 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 節點的答案。

則易得:

f u=

au

+max⁡v

∈subtree(u

)max⁡(

fv,0

)f_u = a_u + \max_(u)} \max(f_v , 0)

fu​=au

​+v∈

subtree(u

)max

​max(f

v​,0

)時間複雜度:o(n

)\mathcal(n)

o(n)

.實際得分:100pt

s100pts

100pts

.

#pragma gcc optimize(2)

#include

using

namespace std;

const

int n=

1.6e4+1

;inline

intread()

int x=0;

while

(ch>=

'0'&& ch<=

'9') x=

(x<<3)

+(x<<1)

+ch-

'0',ch=

getchar()

;return x*f;

}inline

void

write

(int x)

if(x<10)

write

(x/10);

putchar

(char

(x%10

+'0'))

;}int n,a[n]

,f[n]

;vector<

int> g[n]

;int ans=-(

1<<31)

;inline

void

dfs(

int u,

int fa)

}int

main()

dfs(1,

0);for

(int i=

1;i<=n;i++

) ans=

max(ans,f[i]);

printf

("%d\n"

,ans)

;return0;

}

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 最大子樹和

小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有nn朵花,共有n 1n 1條枝幹將花兒連在一起,並且未修剪時...

P1122 最大子樹和 (樹形DP)

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