問題描述
有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?
輸入格式
第一行包含乙個整數 n 。
接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。
接下來一共 n-1 行,每行描述樹上的一條邊。
輸出格式
輸出乙個整數,代表選出的點的權值和的最大值。
樣例輸入
51 2 3 4 5
1 21 3
2 42 5
樣例輸出
12樣例說明
選擇3、4、5號點,權值和為 3+4+5 = 12 。
資料規模與約定
對於20%的資料, n <= 20。
對於50%的資料, n <= 1000。
對於100%的資料, n <= 100000。
權值均為不超過1000的正整數。
解題思路:
首先,要進行建樹,利用鄰接矩陣表示法,每輸入一組資料,都更新鄰接矩陣,並且更新根結點。
其次,進行深搜遞迴操作,終止條件為尋到的結點為葉子結點。每乙個節點有兩種,選中和不選。
父節點擊中時,最大權值更新為選擇父節點的權值加未選擇的子節點權值 。父節點未被選中時,最大權值更新為未選擇父節點的權值加子節點權值最大值。
]=;//每個節點兩種狀態分別的權值
int visit[n]=;
//判斷是否訪問過該結點
vector<
int> node[n]
;//各結點鄰接矩陣
intmax
(int a,
int b)
//找出最大值
return b;
}voiddp(
int root)
//樹形動態規劃常常用到深搜
visit[root]=1
;//將標誌符設為訪問過
for(
int i=
0;i.size()
;i++
)//遍歷所有有連線
dp[root][0
]+=dp0;
dp[root][1
]+=(dp1+s[root]);
}int
main()
int a,b;
int root=-1
;//記錄根結點
for(
int j=
1;j(root)
;//利用深搜dp
printf
("%d"
,max
(dp[root][0
],dp[root][1
]));
//比較根結點在選擇和未選擇情況下的值
return0;
}
藍橋杯 演算法訓練 結點選擇
題目 問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一...
藍橋杯 演算法訓練 結點選擇
題目問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條...
藍橋杯 結點選擇
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?解題思路 這題模型是樹形動態規劃入門題目,dp i 0 表示該節點不被選擇,dp i 1 表示該結點被選擇。轉移方程為 dp u 1 dp v 0 ...