HDU 3534 Tree 樹形dp統計

2021-06-09 13:23:01 字數 1051 閱讀 8060

題意:給定n(範圍不明確,不過10000可以過)個點的樹,問樹的直徑有多少條。

題解:維護乙個子根節點到子樹中葉子節點的最長路,次長路和對應的個數,注意路之間不能在同一棵子樹內,然後統計每棵子樹的直徑,最後遍歷得到答案。

#include #include #include using namespace std;

const int inf = 1 << 29;

const int maxn = 10002;

struct node

edge[maxn << 1];

struct a

ans[maxn];

int head[maxn];

int n,idx;

void init()

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

void read()

else if(tmp == ans[st].dep1)

else if(tmp > ans[st].dep2)

else if(tmp == ans[st].dep2)

}if(leaf)

int c1 = 0,c2 = 0;

for(int i=head[st];i != -1;i=edge[i].next)

int type; //當前子樹內的直徑有三種情況,最大+最大(dep1+dep1),最大+次大(dep1+dep2),最大(dep1)

if(c1 > 1) type = 1;

else if(c2 > 0) type = 2;

else type = 3;

if(type == 1)}}

else if(type == 2)}}

else

return;

}void solve()

else if(ans[i].path == res)

}printf("%d %d\n",res,num);

return;

}int main()

return 0;

}

HDU 3534 Tree 經典樹形dp

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

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...

BJ模擬 tree 樹形dp

題目描述 給一棵 n n 個節點的邊帶權樹,要求在樹上選出 k role presentation style position relative k k個點 a1 a2,aka 1,a2,a k,使得 k 1i 1dis ai,ai 1 i 1k 1 dis ai,a i 1 最小。1 k n 3...