HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)

题意:求出的树中距离最远的两个结点之间相隔的距离

水题一道,以前只会用路的直径来解。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<memory>
#include<algorithm>
using namespace std;
const int maxn=200010;
int dis[maxn],Laxt[maxn],Next[maxn],To[maxn];
int cnt,S,Max;
void add(int u,int v)
{
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
}
void _dfs(int u)
{
    for(int i=Laxt[u];i;i=Next[i]){
        if(!dis[To[i]]){
            dis[To[i]]=dis[u]+1;
            if(dis[To[i]]>Max){
                Max=dis[To[i]];
                S=To[i];
            }
            _dfs(To[i]);
        }
    }
}
int main()
{
    int n,i,j,u,v;
    scanf("%d",&n);
    for(i=1;i<n;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    dis[1]=1;S=1;Max=1;
    _dfs(1);
    memset(dis,0,sizeof(dis));
    dis[S]=1;Max=1;
    _dfs(S);
    printf("%d
",Max-1);
}

树形DP:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<memory>
#include<algorithm>
using namespace std;
const int maxn=200010;
int Laxt[maxn],Next[maxn],To[maxn];
int dp[maxn],vis[maxn];
int cnt,ans;
void add(int u,int v)
{
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
}
int _dfs(int u)
{
    for(int i=Laxt[u];i;i=Next[i]){
        if(!vis[To[i]]){
            vis[To[i]]=1;
            _dfs(To[i]);
            ans=max(ans,dp[u]+dp[To[i]]+1);
            dp[u]=max(dp[u],dp[To[i]]+1);
        }
    }
    return dp[u];
}
int main()
{
    int n,i,j,u,v;
    scanf("%d",&n);
    for(i=1;i<n;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    vis[1]=1;
    _dfs(1);
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hua-dong/p/7774647.html