樹中節點和

2022-10-11 14:03:10 字數 3235 閱讀 6109

給定一棵 $n$ 個節點組成的樹。

樹中節點編號為 $1 \sim n$。

$1$ 號節點為樹的根節點。

樹中的每個節點 $v$ 都具有乙個非負整數權值 $a_$。

我們用 $s_$ 來表示從節點 $v$ 到根節點的路徑上經過的所有節點(包括兩端節點)的權值之和;用 $h_$ 來表示從節點 $v$ 到根節點的路徑上經過的所有節點(包括兩端節點)的數量。

顯然,$s_=a_$,$h_=1$。

現在,我們只知道樹的具體結構以及所有 $h$ 值為奇數的節點的 $s$ 值。

請你為樹中的每個節點 $v$ 賦予乙個非負整數權值 $a_$,要求在滿足已知資訊的情況下,所有節點的權值之和 $\sum\limits_^ }$ 盡可能小。

輸出 $\sum\limits_^ }$ 的最小可能值。

輸入格式

第一行包含乙個整數 $n$。

第二行包含 $n−1$ 個整數 $p_,p_, \dots,p_$,其中 $p_$ 表示節點 $i$ 的父節點編號。

第三行包含 $n$ 個整數 $s_,s_, \dots,s_$,注意,由於所有 $h$ 值為偶數的節點的 $s$ 值都是未知的,所以這些節點的 $s$ 值並未直接給出,而是用 $−1$ 來代替。

輸出格式

乙個整數,表示 $\sum\limits_^ }$ 的最小可能值。

如果不存在任何滿足已知資訊的合理賦值方案,則輸出 $−1$。

資料範圍

前 $4$ 個測試點滿足 $2 \leq n \leq 5$。

所有測試點滿足 $2 \leq n \leq ^$,$1 \leq p_ < i$,$−1 \leq s_ \leq ^$。

輸入樣例1:

511

111 -1 -1 -1 -1

輸出樣例1:

1
輸入樣例2:

512

311 -1

2 -1 -1

輸出樣例2:

2
輸入樣例3:

312

2 -1

1

輸出樣例3:

-1
我們先考慮區域性的情況,我們考慮某個子樹,這個子樹的根到根節點的距離是偶數(這裡的距離是指路徑經過結點的數量,下同),子樹的根到根節點的權值之和是不知道的,這棵子樹的子節點到根節點的權值之和是知道的。

現在我們要求這個區域性各個結點的權值之和,那麼有$a_p + a_2 + a_3 + a_4 = \left( \right) + \left( \right) + \left( \right) - 2a_p$。我們希望這個權值之和最小,又因為$s_2 - s_1$,$s_3 - s_1$,$s_4 - s_1$是乙個定值,因此只能讓$a_p$取盡可能大的值。

又由於每一項$a_i \geq 0$,因此根據$3$條等式就會有$a_p \leq s_2 - s_1$,$a_p \leq s_3 - s_1$,$a_p \leq s_4 - s_1$,因此$a_p$能夠取到最大的值就是$a_p = min \left\ \right\}$。

因此如果只考慮乙個區域性的話,如果子樹的根到根節點的距離為偶數,那麼要使得子樹的根和它的兒子的權值之和最小,就讓子樹的根取上面得到的值就可以的了。

下面考慮整體。

如果兩個區域性不再一棵子樹裡:

那麼不管其中乙個的區域性取什麼值,都不會影響另外乙個區域性的取值。因為對於兩棵子樹的根節點來說,兩棵子樹是完全獨立的,因此兩棵子樹互不影響。

如果兩個區域性在一顆子樹中:

可以發現不管$a_1$和$a_2$取什麼值,這兩個點的權值和是固定的,而對於$a_3$和$a_4$的權值和$a_3 + a_4 = s_4 - s_2$,可以發現$a_3$和$a_4$的權值和只取決於$2$到根節點的權值和與$4$到根節點的權值和,不管$a_1$和$a_2$取什麼值,$2$到根節點的距離不變,因此不會受$a_1$和$a_2$取值的影響。因此這兩個區域性也不會相互影響。

因此任意兩個區域性都是獨立的,不會相互影響。因此要是整棵樹的權值最小,就要讓每個區域性(到根節點距離為偶數的子樹的根與其兒子)的根取最小值。

ac**如下:

1 #include 2

using

namespace

std;

34 typedef long

long

ll;5

6const

int n = 2e5 + 10;7

8int

head[n], e[n], ne[n], idx;

9int

s[n];

10ll ans;

1112

void add(int v, int

w )

1516

void dfs(int u, int d, int

pre) 22}

23else

2930

if (t < 0) ans = -9e18; //

如果t < 0,說明存在s[e[i]] - s[pre] < 0,t要取負數才滿足,矛盾

31else

if (t != 2e9) ans += t; //

如果t == 2e9說明結點u是乙個葉子結點,其權值取值沒有限制,因此可以取0

3233

//加上兒子的權值

34for (int i = head[u]; i != -1; i =ne[i]) 37}

38}3940

intmain()

5051

for (int i = 1; i <= n; i++)

5455 ans = s[1]; //

根節點不再任何乙個區域性中,因此先加上根節點的權值

56 dfs(1, 1, -1

);57

58 printf("

%lld

", ans < 0 ? -1

: ans);

5960

return0;

61 }

acwing 4427. 樹中節點和(acwing杯 - 周賽):

裝置樹中的特殊節點

裝置樹用來描述乙個平台上的裝置資訊,不僅包括soc上的裝置,還可以新增乙個外設資訊,簡單記錄一下裝置樹中的特殊節點的理解 裝置樹中的位址資訊一般用 address cells和 size cells來修飾,address表示位址由幾個單元組成,乙個單元是乙個32位的值 在32位系統上 size ce...

遍歷節點樹

從以下屬性讀出來的資訊可以讓我們了解相鄰節點之間的關係。nodelist node.childnodes 這個屬性返回的陣列是乙個nodelist集合。這個nodelist集合裡的每個節點都是乙個節點物件。這些節點物件都有著nodetype nodename nodevalue等常見的節點屬性。文字...

樹的節點的和以及樹的子樹

樹的節點的和以及樹的子樹 由於樹的節點的求和運算,是一條路徑判斷求和,因此不太適合用容器思想。子樹是可以的,比較麻煩。採用前序遍歷,先儲存根節點判斷 在儲存左子節點判斷,在儲存右子節點判斷,然後迭代替換。涉及到不是從根節點開始計算的題目 應該從三部分計算 1.根節點 左子節點 右子節點 2.重寫根節...