藍橋杯 結點選擇 鏈式前向星

2021-08-15 08:47:41 字數 1442 閱讀 5983

問題描述

有一棵 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 行,每行描述樹上的一條邊。...