同步
原題鏈結
簡要題意:
給定一棵 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
+maxv
∈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 如果...