当前位置: 首页 > news >正文

[模板]树的最长路径

[模板]树的最长路径

题目描述

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • API 架构(RPC和RESTful)
  • 翻译:openmax文档
  • STM32与51单片机的区别:是否应该直接学习STM32?
  • [深度学习]神经网络
  • Linux入门学习:Git
  • 建筑工程系列专业职称评审条件大全
  • QT 数据加密
  • QCommandLineParser简介
  • golang学习笔记16-数组
  • [ffmpeg] packet
  • Vue路由vue-router的简单用法
  • 结构设计模式 -装饰器设计模式 - JAVA
  • 技术美术百人计划 | 《5.1.2 PBR-基于物理的相机》笔记
  • 百易云资产管理运营系统 ticket.edit.php SQL注入漏洞复现
  • 前端基于Rust实现的Wasm进行图片压缩的技术文档
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • ➹使用webpack配置多页面应用(MPA)
  • angular2开源库收集
  • docker容器内的网络抓包
  • extract-text-webpack-plugin用法
  • JAVA并发编程--1.基础概念
  • js数组之filter
  • LeetCode29.两数相除 JavaScript
  • Linux中的硬链接与软链接
  • pdf文件如何在线转换为jpg图片
  • SQLServer之创建数据库快照
  • 记一次删除Git记录中的大文件的过程
  • 如何设计一个微型分布式架构?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入口文件开始,分析Vue源码实现
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 《天龙八部3D》Unity技术方案揭秘
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​secrets --- 生成管理密码的安全随机数​
  • ​低代码平台的核心价值与优势
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 达梦数据库知识点
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)glDrawArry绘制
  • (数据结构)顺序表的定义
  • (四)c52学习之旅-流水LED灯
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)Oracle存储过程编写经验和优化措施
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net FrameWork简介,数组,枚举
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net程序帮助文档制作
  • .net网站发布-允许更新此预编译站点
  • .net中的Queue和Stack