E33 树形DP 树的直径

视频链接:E33 树形DP 树的直径_哔哩哔哩_bilibili

 

B4016 树的直径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

PT07Z - Longest path in a tree - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int N=100010;
int n,a,b,c,ans;
struct edge{int y,w;};
vector<edge> e[N];

int dfs(int x,int fa){
  int d1=0,d2=0,d;
  for(auto i:e[x]){
    int y=i.y,w=i.w;
    if(y==fa) continue;
    d=dfs(y,x)+w;
    if(d>d1) d2=d1,d1=d;
    else if(d>d2) d2=d;
  }
  ans=max(ans,d1+d2);
  return d1;
}
int main(){
  cin>>n;
  for(int i=1;i<n;i++){
    cin>>a>>b;
    e[a].push_back({b,1});
    e[b].push_back({a,1});
  }
  dfs(1,-1);
  cout<<ans;
}

 

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int N=100010;
int n,a,b,ans;
int d1[N],d2[N];
vector<int> e[N];

void dfs(int x,int fa){
  d1[x]=d2[x]=0;
  for(int y:e[x]){
    if(y==fa) continue;
    dfs(y,x);
    int t=d1[y]+1;
    if(t>d1[x]) d2[x]=d1[x],d1[x]=t;
    else if(t>d2[x]) d2[x]=t;
  }
  ans=max(ans,d1[x]+d2[x]);
}
int main(){
  cin>>n;
  for(int i=1;i<n;i++){
    cin>>a>>b;
    e[a].push_back(b);
    e[b].push_back(a);
  }
  dfs(1,-1);
  cout<<ans;
}

 

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int N=100010;
int n,a,b,ans;
int d[N];
vector<int> e[N];

void dfs(int x,int fa){
  for(int y:e[x]){
    if(y==fa) continue;
    dfs(y,x);
    ans=max(ans,d[x]+d[y]+1);
    d[x]=max(d[x],d[y]+1);
  }
}
int main(){
  cin>>n;
  for(int i=1;i<n;i++){
    cin>>a>>b;
    e[a].push_back(b);
    e[b].push_back(a);
  }
  dfs(1,-1);
  cout<<ans;
}

 

posted @ 2023-04-10 10:19  董晓  阅读(520)  评论(3编辑  收藏  举报