題意:給定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...