题目传送门

题目描述

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

请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。

输入格式

第一行包含整数 n。

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

输出格式

输出一个整数,表示所求点到树中其他结点的最远距离。

数据范围

1≤n≤10000
1≤ai,bi≤n
−105≤ci≤105

输入样例:

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

输出样例:

2

题解:

树形DP:dfs俩次,第一次求以u为节点,用d1和d2来记录向下走的最长路和次长路, 并用p1 p2来记录最长路和次长路来自哪个节点, 最后取以u为节点向下走的最远距离和向上走的最远距离的最小值

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10010;
int h[N], e[N * 2], w[N * 2], ne[N * 2], idx;
// d1 和 d2 分别表示以 i 为起点向下走的最大值和次大值
//up表示向上走的最长路径是多少
//p1 和 p2 表示最长路和次长路分别是从哪条边走上来的
int d1[N], d2[N], up[N], p1[N], p2[N];
int ans;
void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int dfs_d(int u, int father)//向下走
{if(h[u] == -1) return 0;d1[u] = d2[u] = -1e9;for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];if(j == father)continue;int d = dfs_d(j, u) + w[i];if(d >= d1[u]){d2[u] = d1[u];d1[u] = d;p2[u] = p1[u], p1[u] = j;}else if(d > d2[u]){d2[u] = d;p2[u] = j;}}if(d1[u] == -1e9)d1[u] = d2[u] = 0; // 判断是否为叶子节点return d1[u];
}
void dfs_u(int u, int father)//向上走
{for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];if(j == father)continue;if(p1[u] == j)up[j] = max(up[u], d2[u]) + w[i];  //要么是次长路, 要什么是up[u];else up[j] = max(up[u], d1[u]) + w[i];  //可以是最长路,要么是up[u];dfs_u(j, u);}
}
int main()
{int n;cin >> n;memset(h, -1, sizeof h);for(int i = 0; i < n - 1; i++){int a, b, c;cin >> a >> b >> c;add(a, b, c);add(b, a, c);}ans = 1e9;dfs_d(1, -1);//往下走dfs_u(1, -1);int res = 1e9;for(int i = 1; i <= n; i++)res = min(res, max(d1[i], up[i]));cout << res << endl;return 0;
}

AcWing1073.树的中心(树形DP)题解相关推荐

  1. AcWing1072. 树的最长路径(树形DP)题解

    题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 现在请你找到树中的一条最长路径. 换句话说,要找到一条路径,使得使得路径两端的点的距离最 ...

  2. AcWing323. 战略游戏(树形DP)题解

    题目传送门 题目描述 鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心. 现在他有以下问题. 他必须保护一座中世纪城市,这条城市的道路构成了一棵树. 每个节点上的士兵可以 ...

  3. AcWing1075. 数字转换(树形DP)题解

    题目传送门 如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x. 例如,4 可以变为 3,1 可以变为 7. 限定所有数字变换在不超过 n 的正整数范 ...

  4. AcWing1077. 皇宫看守(树形DP)题解

    题目传送门 题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见. 大内保卫森严,三步一岗,五步一哨,每个宫殿 ...

  5. AcWing1074. 二叉苹果树(树形DP)题解

    题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点. 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一 ...

  6. 最大搜索二叉子树大小(树形dp)

    给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树 (二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 ): 思路: 这是一道分析可能性求解在二叉树上做类似动态规划的问 ...

  7. POJ 1655 Balancing Act[树的重心/树形dp]

    Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...

  8. AcWing285. 没有上司的舞会(树形DP)题解

    题目传送门 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N. 现在要 ...

  9. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

最新文章

  1. JavaScript 编程精解 中文第三版 零、前言
  2. 阿里“计算”家族技术领头人分享会
  3. MFC中静态文本控件显示的几种实现方式
  4. python实时连接oracle_Python连接Oracle
  5. python中plot和bar要求的格式不一样_在Python中matplotlib中匹配的图形大小,包括和不包含make_axes_locatable- divider colorbars...
  6. Shell命令-网络操作之基础之telnet、ssh
  7. VirtualStudio:离线下载了20G、40G,安装时说缺少很多
  8. python kivy kv模板调用_正确使用.kv文件进行Kivy并将其导入到Python...
  9. 2020成人高考计算机基础知识题库,成人高考计算机考试全套题库
  10. HDFS的命令行操作
  11. find -regex
  12. jquery.countdown 倒计时插件的学习
  13. 微信隐藏/显示右上角菜单接口
  14. 电路原理 | 非线性电阻电路的小信号法,动态电路电感
  15. 基于SEIR模型的网络医疗众筹传播建模与仿真分析
  16. 如何扎实的学好ABAP?我的个人经验
  17. 租房/搬家必备物品清单
  18. K-均值聚类算法(Python,机器学习 ,绘图)
  19. 中国智慧物流行业应用模式与运营前景动态调研报告2022版
  20. UART串口协议基础1

热门文章

  1. 1004. Counting Leaves (30)
  2. [LinuxVim]基础01
  3. FLEX4中的Panel如何实现带自定义图标和按钮
  4. Word 模板 - 新建向导
  5. 3.Dockerfile
  6. 夯实Java基础(十九)——集合
  7. Nginx 默认的日志类型
  8. 【笔记】LR录制方式和常用函数
  9. Luogu1007 独木桥
  10. luogu2680 运输计划