E34 树形DP 树的中心

视频链接:E34 树形DP 树的中心_哔哩哔哩_bilibili

 

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

const int N=20010;
int n,a,b,c,ans=2e9;
struct edge{int v,w;};
vector<edge> e[N];
int d1[N],d2[N],mx[N],up[N];

void dfs(int u,int fa){
  for(auto i:e[u]){
    int v=i.v,w=i.w;
    if(v==fa) continue;
    dfs(v,u);
    if(d1[v]+w>d1[u]) d2[u]=d1[u],d1[u]=d1[v]+w,mx[u]=v;
    else if(d1[v]+w>d2[u]) d2[u]=d1[v]+w;
  }
}
void dfs2(int u,int fa){
  for(auto i:e[u]){
    int v=i.v,w=i.w;
    if(v==fa) continue;
    if(v==mx[u]) up[v]=max(up[u],d2[u])+w;
    else up[v]=max(up[u],d1[u])+w;
    dfs2(v,u);
  }
  ans=min(ans,max(d1[u],up[u]));
}
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,0);
  dfs2(1,0);
  cout<<ans;
}

 

posted @ 2023-04-10 10:20  董晓  阅读(469)  评论(0编辑  收藏  举报