1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f; int h[N],e[M],ne[M],w[M],idx; int d1[N],d2[N],p[N],leaf[N],up[N]; //d1[u] 表示u往下走的最远距离 d2[u] 表示往下走的最远距离 //p[u]=j 表示u往下走的最远距离经过j leaf[u]=1 表示u是叶子节点 up[u]表示u往上走的最远距离 void add(int a,int b,int c) { e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++; } int dfs(int u,int father) { d1[u]=d2[u]=-INF; for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(j==father) continue; int d=dfs(j,u)+w[i]; if(d>d1[u]) { d2[u]=d1[u],d1[u]=d; //更新u的最大值和次大值 p[u]=j; //更新u经过的节点 }else if(d>d2[u]) { d2[u]=d; //更新次大值 } } if(d1[u]==-INF) //没有更新过最大值,也就是叶子节点 { leaf[u]=1; d1[u]=d2[u]=0; }else if(d2[u]==-INF) { d2[u]=0; } return d1[u]; //返回最大距离 } void dfs2(int u,int father) { for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(j==father) continue; if(p[u]==j) //u的最长路径经过了j,那么j往上走的时候只有由u的往上走的距离和次大距离更新 { up[j]=max(d2[u],up[u])+w[i]; } else up[j]=max(d1[u],up[u])+w[i]; //j往上走的时候只由u的往上走的距离和最大距离更新 dfs2(j,u); //j再继续去更新 } } int main() { int n; cin>>n; memset(h,-1,sizeof h); for(int i=1;i<n;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } dfs(1,-1); dfs2(1,-1); int ans=INF; for(int i=1;i<=n;i++) { if(leaf[i]) ans=min(ans,up[i]); //叶子节点只能往上 else ans=min(ans,max(d1[i],up[i])); //由往下和网上的最大值决定 } cout<<ans; return 0; }
- 1
信息
- ID
- 766
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者