B08 DFS 树的直径

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

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

const int N=10010,M=20010;
int n,a,b,c,ans;
struct edge{int v,w;};
vector<edge> e[N];

int dfs(int x,int fa){
  int d1=0,d2=0; 
  for(auto ed : e[x]){
    int y=ed.v, z=ed.w;
    if(y==fa) continue;
    int d=dfs(y,x)+z;
    if(d>=d1) d2=d1,d1=d;
    else if(d>d2) d2=d;
    // printf("回%d d1=%d d2=%d\n",x,d1,d2);
  }
  ans=max(ans,d1+d2);
  // printf("离%d ans=%d\n",x,ans);
  return d1;
}
int main(){
  cin>>n;
  for(int i=1; i<n; i++){
    cin>>a>>b>>c;
    e[a].push_back({b,c});
    e[b].push_back({a,c});
  }
  dfs(1,-1);
  cout << ans << endl;
  return 0;
}

 

posted @ 2022-05-28 13:02  董晓  阅读(480)  评论(0编辑  收藏  举报