[模板]树的最长路径

模板树的最长路径

题目描述

给定一棵树,树中包含 n 个结点(编号1~n)和 n-1 条无向边,每条边都有一个权值。

现在请你找到树中的一条最长路径。

换句话说,要找到一条路径,使得使得路径两端的点的距离最远。

注意:路径中可以只包含一个点。

输入格式

第一行包含整数 n。

接下来 n-1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。

输出格式

输出一个整数,表示树的最长路径的长度。

样例输入1

6

5 1 6

1 4 5

6 3 9

2 6 8

6 1 7

样例输出1

22

注释说明

1≤n≤10000,1≤ai,bi≤n,-10^5≤ci≤10^5

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,f[100005],ww,maxn,maxf;
bool used[100002]; 
struct ed{
	int to,wi;
};
vector<ed>a[200002];
void dfs(int x,int fa){
	for(int i=0;i<a[x].size();i++){
		int v=a[x][i].to;
		if(v==fa)continue;
		f[v]=a[x][i].wi+f[x];
		dfs(v,x);
	}
	if(maxn<f[x]){
		maxn=f[x];
		maxf=x;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int v,u;
		scanf("%d%d%d",&v,&u,&ww);
		a[v].push_back({u,ww});
		a[u].push_back({v,ww});
	}
	dfs(1,-1);
	f[maxf]=0;
	//memset(f,0,sizeof(f));
	maxn=0;
	dfs(maxf,-1);
	printf("%d\n",maxn);
	
}
/*
6
5 1 6
1 4 5
6 3 9
2 6 8
6 1 7
*/

解法一:从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路。

解法二:算是树的直径的一个性质,树的直径的长度一定会是某个点的最长距离f1x与次长距离f2x之和。最后求出max{f1x+f2x}就可以了。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/linzhi6236/article/details/131604008

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,f1[100005],f2[100005],ww,ans;
struct ed{
	int to,wi;
};
vector<ed>a[200002];
void dfs(int x,int fa){
	f1[x]=0;
	f2[x]=0;
	for(int i=0;i<a[x].size();i++){
		int v=a[x][i].to;
		if(v==fa)continue;		
		dfs(v,x);
		if(f1[v]+a[x][i].wi>f1[x]){
			f2[x]=f1[x];
			f1[x]=f1[v]+a[x][i].wi;
		}
		else if(f1[v]+a[x][i].wi>f2[x]){
			f2[x]=f1[v]+a[x][i].wi;
		}
	}
	ans=max(ans,f1[x]+f2[x]);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int v,u;
		scanf("%d%d%d",&v,&u,&ww);
		a[v].push_back((ed){u,ww});
		a[u].push_back((ed){v,ww});
	}
	dfs(1,-1);
	printf("%d\n",ans);
	
}
/*
6
5 1 6
1 4 5
6 3 9
2 6 8
6 1 7
*/
相关推荐
Jerry44 分钟前
LeetCode 101. 对称二叉树
算法
可编程芯片开发2 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星2 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮2 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84072 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>3 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC3 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC4 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师4 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水4 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试