Peter算法小课堂—树上建模

太戈编程1720题

题目描述:

传说有一个大家族里共n名男性成员,编号1到n。其中共有n-1条父子关系。现在他们要挑选若干人组成家族护卫队抵抗外族入侵。i号成员的战斗力为zi, 大家当然希望挑选最强护卫队。但是为了防止"父子矛盾"的魔咒应验,大家决定不会让父子两人同时入选。请问护卫队选出的队员总战斗力最大是多少?

这题简称"树上最优独立集"。我们知道把一个树拉直后就会成为一条树链。

那么思考一下如何DP,如何定义状态。

那状态转移方程呢?

具体的话还是dfs啊

太戈编程861题

题目描述:

二战中,空军司令lester奉命布置对敌方阵地的轰炸,以破坏其通讯体系。敌方通讯网络共n个节点,之间有n-1条双向直接通信通道。轰炸之前,任意两个节点都可以通过直接或间接通信取得联系。lester的弹药量很有(han)限(chan),只能炸毁其中一个节点,与被炸节点的直接通信将被全部切断,而剩余n-1个节点将被分割成无法互相通信的若干区域,而每个区域内部仍可互相通信。lester想知道如何才能使剩下的仍可通信的最大区域最小

这题是个树的重心问题。

太戈编程763题

题目描述:

盗墓界的三巨头:lester天真无邪,葛胖胖,职业失踪z70。有一次他们去到一个古墓,共有n个墓室,通过n-1条双向通道相连(保证两两墓室都可达)。每条通道长1公里。lester他们不小心走散了,分别走到三个墓室lester位于x,葛胖胖位于y,z70位于z。现在葛胖胖和lester想知道他俩之间的距离是多少?

看了这张图,是不是感觉能做了?但是,时间复杂度为O(T*N),那要得运行多少次啊。 那思考一下,时间浪费在那里了?

那么我们手算以下样例,发现:路径必须经过u和v的最近公共祖先节点a。则路径长度为du-da+dv-da

最近公共祖先简称LCA,采取同步爬树法,代码如下

cpp 复制代码
int lca(int u,int v){
	while(u<v) u=p[u];
	while(v<u) v=p[v];
	while(u!=v) u=p[u],v=p[v];
	return u;
}
相关推荐
疯狂打码的少年12 分钟前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
-凌凌漆-1 小时前
【freertos】Task创建(v2)
java·开发语言·算法
Nil2082 小时前
leetcode 24两两交换链表中的节点
算法·leetcode·链表
.格子衫.2 小时前
033动态规划之状态压缩DP——算法备赛
算法·动态规划
ysa0510302 小时前
c++常用自带函数用法与注意
c++·笔记·算法
带多刺的玫瑰3 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王3 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes3 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent
阿无,4 小时前
布隆过滤器
java·算法·哈希算法