[模板]树的最长路径

ops/2024/9/23 4:21:45/

[模板]树的最长路径

题目描述

给定一棵树,树中包含 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

#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中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路。

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

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/linzhi6236/article/details/131604008

#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
*/


http://www.ppmy.cn/ops/114013.html

相关文章

LeetCode[中等] 74.搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

记录一下,Vcenter清理/storage/archive空间

一、根因 vpostgres&#xff1a;这个目录可能包含与 vCenter Server 使用的 PostgreSQL 数据库相关的归档文件过多&#xff0c;导致空间被占用。 二、处理过程 1、SSH登陆到Vcenter. 2、df -Th **图中可以看到 /storage/archive 使用占比很高。 /storage/archive 目录通常用…

初探IT世界:从基础到未来

初探IT世界&#xff1a;从基础到未来 1. 引言 随着科技的不断发展&#xff0c;IT&#xff08;信息技术&#xff09;已经成为全球经济的支柱之一。从软件开发、网络安全到数据分析和人工智能&#xff0c;IT 领域为我们的日常生活提供了许多不可或缺的技术服务。无论你是初学者…

CSP-J 计算机网络

文章目录 前言计算机网络的定义计算机网络的发展计算机网络的主要功能计算机网络的分类按网络地理范围分类按网络拓扑结构分类 OSI模型与TCP/IP模型OSI模型TCP/IP模型OSI模型与TCP/IP模型的网络协议及功能 IP地址域名1. **通用顶级域名&#xff08;gTLD&#xff0c;Generic Top…

OpenGL使用Glfw框架创建第一个窗体

code #include <iostream> /* glad必须先包含&#xff0c;后包含glfw */ #include "glad/glad.h" #include "glfw/glfw3.h"int main() {// 1 初始化GLFW基本环境glfwInit();// 1.1设置OpenGL主版本、次版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJ…

Console 相关方法使用

Console 相关方法使用 mdn 官方文档参考 博客参考文章前端面试题库助手 1. console.log() 作用&#xff1a;打印日志 console.log("hello world");// hello world2. console.info() 作用&#xff1a; 控制台输出一条普通信息&#xff08;Chrome 浏览器中与 log 相同&…

算法基础-二分查找

左闭右闭 [ left&#xff0c;right ] [1,1]可以 while( left < right ) if( a[mid] > target ) right mid - 1 else if( a[mid] < target ) left mid 1 左闭右开 [ left&#xff0c;right ) …

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…