“你知道吗,树的直径有两种求法。”
两遍dfs的方法不说了,应当是没问题了。
这是一种dp做法,记录以每个点的子树的最长链和次长链(不能重叠)
void dfs(int noww,int from) {
dp[noww][0]=0;dp[noww][1]=0;
for (int j=head[noww];j;j=a[j].nxt){
int vv=a[j].to;
if(vv!=from){
dfs(vv,i);
if (dp[vv][0]+a[j].dis>dp[i][0]){
dp[i][1]=dp[i][0];
dp[i][0]=dp[vv][0]+a[j].dis;
}
else if(dp[to[j]][0]+a[j].dis>dp[i][1])
dp[i][1]=dp[vv][0]+a[j].dis;
}
}
ans=max(ans,dp[i][0]+dp[i][1]);
}//dfs(1,-1);
感觉这种方法更灵活些,缺点是...容易写错
比如某次模拟赛,血和泪的教训哇\(QAQ\)