Acwing 1072. 树的最长路径
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing 1072. 树的最长路径相关的知识,希望对你有一定的参考价值。
题意:
每个边有权值,求树的直径
题解:
两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树
我们可以将点看作是钉子,边就是挂在钉子上的绳子,我们只需要求出第一长和次长的绳子,就可以得到最长的路径
详细过程不作表述
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
const int maxn=1e5+9;
int ans;
int n;
vector<pair<int,int> >vec[maxn];
int dfs(int u,int fa){
int dist=0;
int d1=0,d2=0;
for(int i=0;i<vec[u].size();i++){
int v=vec[u][i].first;
int w=vec[u][i].second;
if(v==fa)continue;
int d=dfs(v,u)+w;
dist=max(dist,d);
if(d>=d1)d2=d1,d1=d;
else if(d>d2)d2=d;
}
ans=max(ans,d1+d2);
return dist;
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
vec[u].push_back(make_pair(v,w));
vec[v].push_back(make_pair(u,w));
}
dfs(1,-1);
cout<<ans<<endl;
}
以上是关于Acwing 1072. 树的最长路径的主要内容,如果未能解决你的问题,请参考以下文章