Acwing 1072. 树的最长路径

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing 1072. 树的最长路径相关的知识,希望对你有一定的参考价值。

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. 树的最长路径的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的最长交错路径

UVA10308 Roads in the North 树的最长路径

树的直径

Acwing897 最长公共子序列

543. 二叉树的直径

AcWing 895. 最长上升子序列(LIS朴素做法)