藍橋杯 結點選擇

2021-06-28 14:16:47 字數 836 閱讀 9001

問題描述

有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?

解題思路:

這題模型是樹形動態規劃入門題目,

dp[i][0]表示該節點不被選擇,dp[i][1]表示該結點被選擇。

轉移方程為:

dp[u][1]+=dp[v][0];//選擇了u結點,則與它鄰接的結點不選;

dp[u][0]+=max(dp[v][0],dp[v][1]);不選擇u結點,則與它鄰接的結點選擇結果最大的;

應該特別注意:該題結點數量較大,應該選用鄰接表儲存邊的關係

#include#include#define max(a,b) ((a)>(b)?(a):(b))

#define maxn 100010

bool vis[maxn];

int dp[maxn][2];

int father[maxn];

int head[maxn];

int n;

int cnt;

struct edge

edge[2*maxn];

void add(int u,int v)

void treedp(int u) }}

void init()

int main()

{ init();

scanf("%d",&n);

for(int i=1;i<=n;i++)

scanf("%d",&dp[i][1]);

int root=0;

int begin=1;

for(int i=0;i

藍橋杯 演算法訓練 結點選擇

題目 問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一...

藍橋杯 結點選擇 樹形dp

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...

結點選擇 藍橋杯演算法集

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...