題意:給你一棵樹,問你有多少對點的距離等於樹的直徑。
思路: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 由某有多個兒子的節點...