HDU 3534 Tree 經典樹形dp

2021-07-23 21:33:50 字數 925 閱讀 1024

題意:在一棵樹上找最長路徑,和他出現的個數。

思路:有做過poj1985(求樹直徑)的基礎,我們知道我們一遍dfs可以得到dp[i]表示i點為根的子樹到葉子的最長距離,次長距離,同時我們還可以記載他們出現的數量。

我們可以先簡單的分析,定義dp[i][0],dp[i][1]i點為根到葉子的最長,次長距離,dp[i][2],dp[i][3],表示他們出現的次數。如果對於某個節點,最長次長不相等(dp[i][0]!=dp[i][1]),那麼經過這點的最長路徑的個數就是他們乘積(dp[i][2]*dp[i][3]),反之,可以在轉移過程中求得如果次長和最長相等的個數。

分析:轉移過程具體看**,思路很清晰。(懶)

#includeusing namespace std;

const int maxn=1010;

template//n點的個數,m邊的個數

struct graph

v[n];

struct edgee[m];

void init()

void add_edge(int u,int v,int w)

};const int n=1000000+10;

graphg;

int dp[n][5];

void dfs(int u,int f)

if(dp[v][0]+w==dp[u][1]) dp[u][3]+=dp[v][2];//更新根到葉子次長的個數

if(dp[v][0]+w>dp[u][0])

else if(dp[v][0]+w>dp[u][1])

}}int n;

int main()

int ans=0;

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

}printf("%d %d\n",maxx,ans);

}}

HDU 3534 Tree 經典樹形dp

題意 給你一棵樹,問你有多少對點的距離等於樹的直徑。思路 dp i 0 表示在i的子樹中 離i最遠的距離,dp i 1 是次遠距離。cnt i 0 則是最遠的點的數量,cnt i 1 表示次遠的數量。up i 表示以i向上 離i最遠的距離。up cnt i 表示向上最遠的數量。寫的有點麻煩,除錯了2...

HDU 3534 Tree 樹形dp統計

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

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

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