給定一棵樹,節點編號1∼n
1\sim n
1∼n,每個節點有個權值,要求選出若干個點,使得沒有兩個點之間有邊,並且總權值和最大。問這個最大權值和。
輸入格式:
第一行乙個整數n
nn。接下來n
nn行,第i
ii行表示第i
ii個節點的權值。再接下來n−1
n-1n−
1行,每行輸入一對整數l,k
l, k
l,k,表示l
ll是k
kk的孩子。
輸出格式:
輸出最大的權值總和。
資料範圍:
1 ≤n
≤6000
1\le n\le 6000
1≤n≤60
00−
128≤ai
≤127
-128\le a_i\le 127
−128≤a
i≤1
27a
ia_i
ai是節點i
ii的權值
設f [i
][0]
f[i][0]
f[i][0
]是以i
ii為根節點的子樹中,不包含i
ii的所有合法選法的最大權值,而f[i
][0]
f[i][0]
f[i][0
]是以i
ii為根節點的子樹中,包含i
ii的所有合法選法的最大權值。設c(i
)c(i)
c(i)
是i
ii的全體孩子節點,則有:f[
i][1
]=∑f
[c(i
)][0
]\beginf[i][0]=\sum \max_\ \\f[i][1]=\sum f[c(i)][0] \end
f[i][1
]=∑f
[c(i
)][0
]意思是,如果不選i
ii,那麼每個孩子的子樹,其根可選可不選,那就挑個總權值更大的方案;如果選i
ii,那麼每個孩子的子樹,其根必不選。**如下:
#include
#include
using
namespace std;
const
int n =
6010
;// 用鄰接表存樹
int h[n]
, e[n]
, ne[n]
, idx;
int f[n][2
];int a[n]
;bool has_father[n]
;void
add(
int a,
int b)
intdfs
(int u)
}int
main()
// 找樹根
int root =1;
while
(has_father[root]
) root++
;dfs
(root)
; cout <<
max(f[root][0
], f[root][1
])<< endl;
return0;
}
時空複雜度o(n
)o(n)
o(n)
。
AcWing 285 沒有上司的舞會
acwing 285.沒有上司的舞會 ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀...
Acwing 285 沒有上司的舞會
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 h i hi 給出,其中 1 i n 1 i n 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,...
Acwing 0x50 動態規劃 沒有上司的舞會
題意 ural大學有n名職員,編號為 他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。...