給定一棵 $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輸出樣例1:111 -1 -1 -1 -1
1輸入樣例2:
512輸出樣例2:311 -1
2 -1 -1
2輸入樣例3:
312輸出樣例3:2 -1
1
-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 2acwing 4427. 樹中節點和(acwing杯 - 周賽):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 }
裝置樹中的特殊節點
裝置樹用來描述乙個平台上的裝置資訊,不僅包括soc上的裝置,還可以新增乙個外設資訊,簡單記錄一下裝置樹中的特殊節點的理解 裝置樹中的位址資訊一般用 address cells和 size cells來修飾,address表示位址由幾個單元組成,乙個單元是乙個32位的值 在32位系統上 size ce...
遍歷節點樹
從以下屬性讀出來的資訊可以讓我們了解相鄰節點之間的關係。nodelist node.childnodes 這個屬性返回的陣列是乙個nodelist集合。這個nodelist集合裡的每個節點都是乙個節點物件。這些節點物件都有著nodetype nodename nodevalue等常見的節點屬性。文字...
樹的節點的和以及樹的子樹
樹的節點的和以及樹的子樹 由於樹的節點的求和運算,是一條路徑判斷求和,因此不太適合用容器思想。子樹是可以的,比較麻煩。採用前序遍歷,先儲存根節點判斷 在儲存左子節點判斷,在儲存右子節點判斷,然後迭代替換。涉及到不是從根節點開始計算的題目 應該從三部分計算 1.根節點 左子節點 右子節點 2.重寫根節...