HAOI2009 毛毛蟲 樹形dp

2021-07-03 14:54:24 字數 1081 閱讀 9631

試題描述

對於一棵樹,我們可以將某條鏈和與該鏈相連的邊抽出來,看上去就象成乙個毛毛蟲,點數越多,毛毛蟲就越大。例如下圖左邊的樹(圖 1 )抽出一部分就變成了右邊的乙個毛毛蟲了(圖 2 )。

輸入資料

在文字檔案 worm.in 中第一行兩個整數 n , m ,分別表示樹中結點個數和樹的邊數。

接下來 m 行,每行兩個整數 a, b 表示點 a 和點 b 有邊連線( a, b ≤ n )。你可以假定沒有一對相同的 (a, b) 會出現一次以上。

輸出資料

在文字檔案 worm.out 中寫入乙個整數 , 表示最大的毛毛蟲的大小。

樣例輸入

13 12

1 2

1 5

1 6

3 2

4 2

5 7

5 8

7 9

7 10

7 11

8 12

8 13

樣例輸出

11 測試資料範圍

40% 的資料, n ≤ 50000

100% 的資料, n ≤ 300000

題解:

準確的來說深搜一遍就好了。注意父節點有時候也是要算上的。。

#include

#include

#include

using

namespace

std;

struct useb[1000001];

int f[1000001],n,m,a,bb,cnt,ans,son[1000001],next[1000001],point[1000001];

inline

void add(int x,int y)

inline

void dp(int x,int fa)

}int main()

dp(1,0);

cout

<

}

HAOI2009 毛毛蟲 樹形DP

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

haoi2009 毛毛蟲 樹形dp

這道題細節處理不少,但要ac不難 設以i節點為根節點的子樹能形成的最大的毛毛蟲長度為f i 則f i max f j i節點的孩子數 答案需要f最大和次大的兩個子樹合併,而且若合併的位置不是根節點,ans 我就是坑在了最後一點上,最後打表找到了問題 1 include2 include3 inclu...

HAOI2009 毛毛蟲 樹的直徑

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