haoi2009 毛毛蟲 樹形dp

2022-05-12 20:23:26 字數 865 閱讀 4904

這道題細節處理不少,但要ac不難;

設以i節點為根節點的子樹能形成的最大的毛毛蟲長度為f[i],則f[i]=max(f[j])+i節點的孩子數;

答案需要f最大和次大的兩個子樹合併,而且若合併的位置不是根節點,ans++;

我就是坑在了最後一點上,最後打表找到了問題;

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=303000;6

intn,m,f[maxn],child[maxn];

7struct

nodee[maxn<<1

];10

int linkk[maxn],len=0;11

void insert(int x,int

y)16

void

init()23}

24void dfs(int x,int

fa)30}31

int ans=0;32

void dfs(int x,int

fa)36

int maxx[2]=;

37for(int i=linkk[x];i;i=e[i].next)

44 ans=max(ans,f[x]+maxx[0]-1

);45

if(x!=1)ans=max(ans,f[x]+maxx[0

]);46

if(maxx[0]==0)ans=max(ans,f[x]);47}

48void

work()

53int

main()

view code

HAOI2009 毛毛蟲 樹形dp

試題描述 對於一棵樹,我們可以將某條鏈和與該鏈相連的邊抽出來,看上去就象成乙個毛毛蟲,點數越多,毛毛蟲就越大。例如下圖左邊的樹 圖 1 抽出一部分就變成了右邊的乙個毛毛蟲了 圖 2 輸入資料 在文字檔案 worm.in 中第一行兩個整數 n m 分別表示樹中結點個數和樹的邊數。接下來 m 行,每行兩...

HAOI2009 毛毛蟲 樹形DP

題意 給你一棵樹,從樹中取出一部分滿足 是一條鏈 一些直接連在這條鏈上的節點 求節點數最多的合法取出部分。題解 其實這題還是不難?觀察到對於任意一條鏈,只有兩種情況 一條路走到底 or 以某個點為中轉 f x 表示從x往下走,一路走到底的包括x的最優解,f x 包括x也包括father x 將會加入...

HAOI2009 毛毛蟲 樹的直徑

在一棵樹中,一條鏈及與它直接相連的所有邊的集合稱作乙個毛毛蟲,這個子圖中的點數稱作這個毛毛蟲的大小。求一棵樹中最大的毛毛蟲。n leq 3 times10 5 設每個點的權值為 deg i 1 然後求最長路即可,答案就是 ans 2 include using namespace std const...