传送门

题目大意:

一棵无根树,每条边有一个距离,求每个顶点到距离其最远的顶点的距离。

思路:

考虑树形DP+换根。

令D[x]x到以x为根的子树当中的最长距离,d[x]为次长距离,U[x]为x向上走的最长距离,F[x]为x的答案。

第一次dfs以1为根可以很容易求出D[x]与d[x]。

之后第二次dfs对每个顶点去求最终的答案。

令p为父节点,v为当前节点,l为p到v的距离,于是有

F[x]=max(D[x],U[x])

对于D[p] == D[v] + l的情况,说明p向下的最长距离可以从v经过,那么就应该从父节点的向下次长距离,向上的最长距离的最大值+p到v之间的距离中选择一个作为U[x],即U[x]=max(d[p],U[p])+l。

否则,直接就可以考虑父节点向下走的最大值,于是U[x]=max(D[p],U[p])+l

最后每个节点的答案即为F[x]。

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
//#define int LL
#pragma warning(disable :4996)
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const int maxn = 10010;
const long double eps = 1e-8;
const LL MOD = 998244353; struct Edge {
int to, len;
};
int N;
int root = 1;
int F[maxn], D[maxn], d[maxn], U[maxn];//D[x]x到以x为根的子树当中的最长距离,d[x]次长距离,U[x]x向上走的最长距离,F[x]x的答案。
vector<Edge>G[maxn];
bool used[maxn]; void add_edge(int from, int to, int len)
{
G[from].push_back(Edge{ to,len });
G[to].push_back(Edge{ from,len });
} void dfs1(int v)
{
d[v] = D[v] = 0;
used[v] = true;
for (int i = 0; i < G[v].size(); i++)
{
Edge& e = G[v][i];
if (!used[e.to])
{
dfs1(e.to);
int val = D[e.to] + e.len;
if (val >= D[v])
{
d[v] = D[v];
D[v] = val;
}
else if (val > d[v])
d[v] = val;
}
}
} void dfs2(int v, int p, int l)
{
used[v] = true;
if (D[p] == D[v] + l)//p的最长经过v
U[v] = l + max(d[p], U[p]);
else
U[v] = l + max(D[p], U[p]);
F[v] = max(U[v], D[v]);
for (int i = 0; i < G[v].size(); i++)
{
Edge& e = G[v][i];
if (!used[e.to])
dfs2(e.to, v, e.len);
}
} void solve()
{
memset(used, 0, sizeof(used));
memset(D, 0, sizeof(D));
memset(d, 0, sizeof(d));
memset(F, 0, sizeof(F));
memset(U, 0, sizeof(U));
dfs1(root);
memset(used, 0, sizeof(used));
dfs2(root, 0, 0);
for (int i = 1; i <= N; i++)
cout << F[i] << endl;
} int main()
{
IOS;
while (cin >> N)
{
for (int i = 0; i <= N; i++)
G[i].clear();
int v, len;
for (int i = 2; i <= N; i++)
{
cin >> v >> len;
add_edge(i, v, len);
}
solve();
} return 0;
}

AcWing 325. 计算机的更多相关文章

  1. [Z] 计算机类会议期刊根据引用数排名

    一位cornell的教授做的计算机类期刊会议依据Microsoft Research引用数的排名 link:http://www.cs.cornell.edu/andru/csconf.html Th ...

  2. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

  3. Acwing 883高斯消元法的运用

    Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...

  4. 计算机电子书 2018 BiliDrive 备份

    下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 Webpack 中文指南.epub (40 ...

  5. (acwing蓝桥杯c++AB组)1.1 递归

    (acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...

  6. 计算机保研,maybe this is all you need(普通双非学子上岸浙大工程师数据科学项目)

    写在前面 9.28接收了拟录取通知,也终究是尘埃落定了,我人生的又一个阶段也终于结束.面对最终录取结果,或多或少会有所遗憾,但也还是基本达到了预期的目标了. 作为在今年严峻的保研形势下幸存的我,一直想 ...

  7. Web前端需要熟悉大学里【高大上】的计算机专业课吗?

    作为一名刚刚大学毕业,进入新的学习阶段的研究生,我必须说大学的专业课非常重要!不管你信不信,事实就是如此! 一.大学学习的专业课非常重要,它决定了我们能走到什么高度 前端的发展非常快,我常常觉得刚刚关 ...

  8. 计算机人物系列-Mauchly,Eckert,Goldstine

    关键词:莫尔学院(Moore School),阿伯丁试验场(Aberdeen Proving Ground), 雷明顿兰德公司(Remington Rand Corporation), IBM院士(I ...

  9. 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标

    我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...

随机推荐

  1. 大厂面试:一个四年多经验程序员的BAT面经(字节、阿里、腾讯)

    前言 上次写了篇欢聚时代的面经,公众号后台有些读者反馈说看的意犹未尽,希望我尽快更新其他大厂的面经,这里先说声抱歉,不是我太懒,而是项目组刚好有个活动要赶在春节前上线,所以这几天经常加班,只能工作之余 ...

  2. IBM MQ常用运维命令

    创建队列管理器 crtmqm –q QMgrName -q是指创建缺省的队列管理器 删除队列管理器 dltmqm QmgrName 启动队列管理器 strmqm QmgrName 如果是启动默认的队列 ...

  3. 泛型编程与 OI——modint

    博客链接. 在 OI 中,有大量的题目要求对一些数字取模,这便是本文写作的背景. 背景介绍 这些题目要么是因为答案太大,不方便输出结果,例如许多计数 dp:要么是因为答案是浮点数,出题人不愿意写一个确 ...

  4. linux 启动过程原理哦

    bios加电自检硬件设备 grub引导加载程序 当内核被加载到内存,内核阶段就开始了. init进程是所有进程的发起者和控制者.因为在任何基于unix的系统中,它都是第一个运行的进程. 然后执行sys ...

  5. Airtest 的连接安卓模拟器

    1. 开启安卓模拟器 2. 查看进程,MEmuHeadless.exe的进行程号, 然后在cmd中输入 netstat -ano|findstr "16116" 3. 到 airt ...

  6. mycat 简单介绍

    一.mycat? 1.为什么叫mycat 其实mycat在最早的初期版本只支持mysql一种数据库,换句话说mycat其实就是mysql的增强版 在mysql中只是数据库,并没有读写分离和分库分表,这 ...

  7. NumPy 秘籍中文第二版·翻译完成

    原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 Apache ...

  8. HTTPS的基本使用

    1.https简单说明 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的 ...

  9. Mysql Json函数总览 (一)

    JSON函数相关文章均来自官网,此处仅做记录,以便以后查询方便. https://dev.mysql.com/doc/refman/5.7/en/json-functions.html JSON函数参 ...

  10. JAVA char类型

    char类型表示的是单个字符类型,任何数据使用单引号括起来的都是表示字符.字符只能有一个字符. 注意:特殊字符的转义序列:转义字符 转义字符的概述: 特殊字符使用"\"把其转化成字 ...