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

U81904 【模板】树的直径

题目描述

给定一棵树,树中每条边都有一个权值,

树中两点之间的距离定义为连接两点的路径边权之和。

树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。

现在让你求出树的最长链的距离

输入格式

给定一棵无根树

第一行为一个正整数nnn,表示这颗树有nnn个节点

接下来的n−1n-1n1行,每行三个正整数u,v,wu,v,wu,v,w,表示u,vu,vu,vu,v<=nu,v<=nu,v<=n)有一条权值为www的边相连

数据保证没有重边或自环

输出格式

输入仅一行,表示树的最长链的距离

输入输出样例 #1

输入 #1

6
1 2 1
1 3 2
2 4 3
4 5 1
3 6 2

输出 #1

9

说明/提示

对于1010%10的数据 n<=10n<=10n<=10

对于3030%30的数据 n<=1000n<=1000n<=1000

对于5050%50的数据 n<=10000n<=10000n<=10000

对于7070%70的数据 n<=100000n<=100000n<=100000 边权均为正整数

对于100100%100的数据 n<=500000n<=500000n<=500000 边权可能为负

题解

两遍dfs版本(90分),适用于边权非负的树

优点:可以获取的信息多,能获得直径沿途的边
缺点:需要遍历两次

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
typedef long long ll;
int n,st,ed,dis;
vector<pair<int,int>>e[N];
int dist[N],last[N];
void dfs(int u,int f,int w)
{last[u]=f;dist[u] = dist[f]+w;for(auto x:e[u]){int v = x.first;int ww = x.second;if(v==f)continue;dfs(v,u,ww);}
}void road()
{dfs(1,0,0);st = 1;for(int i=2;i<=n;i++){if(dist[st]<dist[i]){st = i;}}dfs(st,0,0);ed=1;for(int i=2;i<=n;i++){if(dist[ed]<dist[i]){ed = i;}}dis = dist[ed];
}void solve()
{cin>>n;for(int i=1;i<n;i++){int u,v,w;cin>>u>>v>>w;e[u].push_back({v,w});e[v].push_back({u,w});}road();cout<<dis<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;// cin>>t;while(t--){solve();}return 0;
}
树型dp(100分),适用于任何树

优点:只需要遍历一次
缺点:只能求直径

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
typedef long long ll;
int n,st,ed,dis;
vector<pair<int,int>>e[N];
int dist[N],ans[N];void dp(int u,int f)
{for(auto x:e[u]){int v = x.first;if(v==f)continue;dp(v,u);}for(auto x:e[u]){int v = x.first;int w = x.second;if(v==f)continue;ans[u]=max(ans[u],dist[u]+dist[v]+w);dist[u]=max(dist[u],dist[v]+w);}
}void solve()
{cin>>n;for(int i=1;i<n;i++){int u,v,w;cin>>u>>v>>w;e[u].push_back({v,w});e[v].push_back({u,w});}dp(1,0);dis = INT_MIN;for(int i=1;i<=n;i++){dis = max(dis,ans[i]);}cout<<dis<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;// cin>>t;while(t--){solve();}return 0;
}
http://www.dtcms.com/a/554180.html

相关文章:

  • 如何将React自定义语法转化为标准JavaScript语法?
  • 自己做网站主机wordpress 引号被转义
  • 做营销网站推广快速开发安卓app
  • 文件基础操作详解
  • 【22】C语言 - 二维数组详解
  • 嵌入式项目代码架构与分层笔记
  • 自己房子做民宿挂什么网站数字今天科技 网站
  • 建设ca网站aws wordpress 集群
  • Rust数据类型(上):标量类型全解析
  • BPC EPM表单常规设置
  • 关于C++递归函数和指针部分
  • 基于STM32的智能天气时钟
  • 传奇网站建设网站开发公用头部
  • 安徽省建设厅官方网站黄世山电商办公室
  • 做的网站上更改内容改怎么办科技公司logo设计图片
  • 飞腾D2000/8在Ubuntu20.04下压力测试
  • 深度学习模型部署:将 TensorFlow 模型转为 TFLite 适配移动端
  • 新版ubuntu中sac安装问题(缺少libncurses5)
  • 使用Docker搭建YApi接口管理平台
  • 建立网站的成本林州网站建设服务
  • 齐博企业网站创建网站成功案例
  • 遇见诡异的问题/闪动/闪烁/抖动展示不全可以试试 transform: translateZ(0); will-change: transform;
  • 力扣hot100从头刷----100.1环形链表
  • 吴镇宇做的电影教学网站做网站的服务器有什么作用
  • 如何将插入(insert)的记录id返回?
  • Cesium地图弹框实现方案演进:从组件化到动态挂载的技术探索
  • 归并|线段树|树状数组
  • 淘宝客网站程序模板便利的广州微网站建设
  • RAGFlow:部署、理论与实战(一)
  • 西安专业网站制作服务专门做动漫的网站有哪些