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;}