樹形dp 無根樹轉有根樹 2023年藍橋杯生命之樹

2022-03-06 20:48:06 字數 1338 閱讀 3281

①暴力解法:列舉子集(選點) + dfs判斷連通性(題目要求連通)滿足上面兩個條件下找出最大值權值和

②dfs無根樹轉有根樹,遞迴找最優

先學習無根樹轉有根樹

參考部落格:

參考部落格:

無根樹轉有根樹模板

void dfs(int cur, int father) }}

這道題思路:從根(任選乙個作為根)出發,自根向下遞迴、自下向上回溯,選取最優(dp),每個節點都有兩種選擇(要、不要這個點)

無根樹的每個節點是平等的,選不同的根沒有區別。

**:樹上找最優

**參考

使用dp陣列存放 選當前節點和不選當前點的兩種狀態

#include#include#includeusing namespace std;

int v[100004];

int dp[100004][2];//表示選擇了當前節點和不選擇的最大分數

int vis[100004];

vectornode[100004];

void dfs(int t)

else//這個子節點是不能走的

思路

無根樹轉有根樹

乙個n n 1000000 個結點的無根樹的各條邊,並指定乙個根結點,要求把樹轉化為有根樹。輸入 結點的數目n,無根樹的各條邊,輸入乙個根結點號。輸出 各個結點的父親編號。執行結果 演算法實現 為方便起見,我們用了stl中的vector來儲存邊,g u 表示u結點的相鄰結點的編號。樹的儲存結構定義 ...

無根樹轉有根樹

輸入乙個n個節點的無根樹的各條邊,並指定乙個根節點,要求把該樹轉化為有根樹,輸出各個節點的父節點編號。樹是一種特殊的圖,因此可以使用鄰接矩陣來表示。如果使用二維陣列來儲存鄰接矩陣,則需要o n2 個元素的空間,因此改用vector陣列。從根節點開始對樹進行dfs。遍歷到每個節點時,使用陣列p來儲存該...

無根樹轉有根樹

1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 include 11 define maxn 1000000 10 12 define inf 100000000...