DP求直径

“你知道吗,树的直径有两种求法。”

两遍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\)

猜你喜欢

转载自www.cnblogs.com/erutsiom/p/9919158.html