問題描述
有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?
輸入格式
第一行包含乙個整數 n 。
接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。
接下來一共 n-1 行,每行描述樹上的一條邊。
輸出格式
輸出乙個整數,代表選出的點的權值和的最大值。
樣例輸入5
1 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的正整數。
一開始看到這道題我是滿臉蒙蔽的!
wtf???
100000個點???wtf???
在正式介紹鏈式前向星之前我們先了解一下前向星:
前向星一種資料結構,以儲存邊的方式來儲存圖。構造方法如下:讀入每條邊的資訊,將邊存放在陣列
中,把陣列中的邊按照起點順序排序,前向星就構造完了。通常用在點的數目太多,或兩點之間有多條弧的時候。一般在別的資料結構不能使用的時候才考慮用前向星。除了不能直接用起點終點定位以外,前向星幾乎是完美的
但是前向星由於將邊的按照一定的方式排序,所以時間開支比較大,這個時候鏈式前向星就出來了.
鏈式前向星又稱為鄰接表的靜態建表方式,其最開始確實是基於前向星,是以提高前向星的構造效率為目的設計的儲存方式,最終演變成了乙個變形的鄰接表這一資料結構。鏈式前向星採用陣列模擬鍊錶的方式實現鄰接表的功能(
陣列模擬鍊錶的主要方式就是記錄下乙個節點在陣列的哪個位置。
),並且使用很少的額外空間,可以說是目前建圖和遍歷效率最高的儲存方式了。
說了這麼多也沒什麼具體的東西,首先貼上本題的解題**
#include#includeusing namespace std;
#define max 100010
#define max(a,b) a>b?a:b
class edges;
edges edge[2*max];
int head[max];
int m = 0;//記錄邊的編號
int dp[max][2];
void addedge(int f,int s)
void dfs(int node,int pre)
}int main()
dfs(1,0);
int m = max(dp[1][0],dp[1][1]);
cout<
藍橋杯 結點選擇
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?解題思路 這題模型是樹形動態規劃入門題目,dp i 0 表示該節點不被選擇,dp i 1 表示該結點被選擇。轉移方程為 dp u 1 dp v 0 ...
藍橋杯 演算法訓練 結點選擇
題目 問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一...
藍橋杯 結點選擇 樹形dp
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...