HDU 3534 Tree 經典樹形dp

2022-04-10 01:57:35 字數 1704 閱讀 4340

題意:給你一棵樹,問你有多少對點的距離等於樹的直徑。

思路:dp[i][0]表示在i的子樹中 離i最遠的距離,dp[i][1]是次遠距離。   cnt[i][0]則是最遠的點的數量,cnt[i][1]表示次遠的數量。

up[i]表示以i向上 離i最遠的距離。   up_cnt[i]表示向上最遠的數量。

寫的有點麻煩,除錯了2小時。。。

1

//#pragma comment(linker, "/stack:102400000, 102400000")

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include

12 #include 13

using

namespace

std;

14 typedef long

long

ll;15 typedef pair p;

16const

int n = 2e5 + 5;17

int dp[n][2

];18

int cnt[n][2

];19

intup[n];

20int

cnt_up[n];

21int son[n][2

];22 vector g[n];

2324

void dfs1(int u, int

p) else

if(dp[v][0] + temp.second == dp[u][0

]) else

if(dp[v][0] + temp.second > dp[u][1

]) else

if(dp[v][0] + temp.second == dp[u][1

]) 55}56

}5758void dfs2(int u, int

p) 72

if(up[u] > dp[u][1

]) else

if(dp[u][1] >up[u]) else

89 } else

else

if(dp[u][0] >up[u]) else

101}

102dfs2(v, u);

103}

104}

105106

intmain()

107113

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

118 dfs1(1, -1

);119 cnt_up[1] = 1

;120 dfs2(1, -1

);121

int max = 0

;122

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

126 ll ans = 0

;127

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

131if(max ==up[i])

134}

135 printf("

%d %lld\n

", max, ans/2

);136

}137

return0;

138 }

HDU 3534 Tree 經典樹形dp

題意 在一棵樹上找最長路徑,和他出現的個數。思路 有做過poj1985 求樹直徑 的基礎,我們知道我們一遍dfs可以得到dp i 表示i點為根的子樹到葉子的最長距離,次長距離,同時我們還可以記載他們出現的數量。我們可以先簡單的分析,定義dp i 0 dp i 1 i點為根到葉子的最長,次長距離,dp...

HDU 3534 Tree 樹形dp統計

題意 給定n 範圍不明確,不過10000可以過 個點的樹,問樹的直徑有多少條。題解 維護乙個子根節點到子樹中葉子節點的最長路,次長路和對應的個數,注意路之間不能在同一棵子樹內,然後統計每棵子樹的直徑,最後遍歷得到答案。include include include using namespace s...

hdu3534,個人認為很經典的樹形dp

題目大意為,求乙個樹的直徑 最長路 以及直徑的數量 樸素的dp只能找出某點開始的最長路徑,但這個最長路徑卻不一定是樹的直徑,本弱先開始就想簡單了,一直wa 直到我看了某位大牛的題解。按照那位大牛的思路,我們來考慮直徑的構成 情況1 由某葉子節點出發產生的最長路徑直接構成 情況2 由某有多個兒子的節點...