树状dp总结

2023-11-05

树的最长路径

树的最长路径

思路 每次都把每个点看成根节点之后进行向下进行遍历每次求最大 和次大值把他相加 不断进行搜索 

#include <bits/stdc++.h>
using namespace std;
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// define int long long
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
int n, m, a[N];
int h[N], e[N], ne[N], w[N], idx;
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(int u, int father)
{
    int dis = 0, d1 = 0, d2 = 0;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (j == father)
            continue;
        int d = dfs(j, u) + w[i];
        dis = max(dis, d);
        if (d >= d1)
            d2 = d1, d1 = d;
        else if (d > d2)
            d2 = d;
    }
    ans = max(ans, d1 + d2);
    return dis;
}
void solve()
{
    cin >> n;
    memset(h,-1,sizeof(h));
    for (int i = 1; i <= n - 1; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    dfs(1, -1);
    cout << ans << endl;
}
signed main()
{
    FAST;
    int T = 1;
    // cin>>T;
    while (T--)
    {
        solve();
    }
}

分析 

树的中心

树的中心

换根dp:

1 指定任意一个为子节点  就是全部更新

2一次dfs统计出档期子树的结点对当前结点的贡献度

3从当前节点向上走找到父节点 父节点出发的且不回到该节点的贡献度  统计答案;

#include <bits/stdc++.h>
using namespace std;
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// #define int long long
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
int n, m, a[N];
int p[N], d1[N], d2[N];
int e[N], w[N], idx, ne[N], h[N], up[N];
bool is_ye[N];
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)//向下找每个节点的项下的最大值和次大值
{
    d1[u] = d2[u] = -INF;
    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;
            p[u] = j;
        }

        else if (d > d2[u])
            d2[u] = d;
    }
    if (d1[u] ==-INF)//叶子结点改变
    {
        d1[u] = d2[u] = 0;
        is_ye[u] = true;
    }
    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 (p[u] == j)
            up[j] = max(up[u], d2[u]) + w[i];//如果最大值又3回去了 则用次大值
        else
            up[j] = max(up[u], d1[u]) + w[i];//没走过则用就可以
        dfs_u(j,u);//别忘了搜索下一层
    }
}
void solve()
{
    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);
    }
    dfs_d(1, -1);
    dfs_u(1, -1);
    int ans = d1[1];
    for (int i = 2; i <= n; i++)
    {
        if (is_ye[i])
            ans = min(ans, up[i]);
        else
            ans = min(ans, max(up[i], d1[i]));
    }
    cout << ans << endl;
}
signed main()
{
    FAST;
    int T = 1;
    // cin>>T;
    while (T--)
    {
        solve();
    }
}

数字转换

数字转化

有一个点入渡为一   之多一条边之后就是森林  (和树差不多)

还有一个点就是埃式筛法 求和 1-n之间的约数之和;

#include <bits/stdc++.h>
using namespace std;
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// #define int long long
typedef long long LL;
typedef pair<int, int> PII;
const int N = 5e5 + 10;
int n, m, a[N];
int sum[N];
int ne[N], h[N], e[N], idx;
bool st[N];
int ans;
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u)//求树的最大直径
{
    st[u] = true;
    int dis = 0, d1 = 0, d2 = 0;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            int d = dfs(j);
            dis = max(dis, d);
            if (d >= d1)
                d2 = d1, d1 = d;
            else if (d > d2)
                d2 = d;
        }
    }
    ans = max(ans, d1 + d2);
    return dis + 1;//返回其值
}
void solve()
{
    cin >> n;
    memset(h, -1, sizeof(h));
    for (int i = 1; i <= n; i++)//埃式筛法  筛选出1-n的和
    {
        for (int j = 2; j <= n / i; j++)
            sum[i * j] += i;
    }
    for (int i = 2; i <= n; i++)//插入树
        if (sum[i] < i)
            add(sum[i], i);
    for (int i = 1; i <= n; i++)//遍历
    {
        if (!st[i])
            dfs(i);
    }
    cout << ans << endl;
}
signed main()
{
    FAST;
    int T = 1;
    // cin>>T;
    while (T--)
    {
        solve();
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树状dp总结 的相关文章

  • C++一本通基础算法:深度优先搜索(DFS)

    算法概述 搜索 类似于枚举 从头结点开始 搜索发现有一些路可以走 先选择一条 走到一个结点处 重复上述过程 一直走到不能走为止 然后返回上一个结点 选择第二条路 一直检索知道将头结点所有的路走完 算法图像 如图所示 从1开始 发现可以到达2
  • 组合数--深度优先算法(DFS)的简单实现

    找出从自然数 1 2 n 0
  • C语言----实现有向图/无向图的创建与基本操作(深度、广度优先遍历)

    最近发现一个不错的项目 Github上数据结构所有算法源码实现 数据结构 严蔚敏 吴伟民 教材源码与习题解析 1 图的数组 邻接矩阵 存储表示 包含算法 有向图 无向图创建 添加顶点 删除边 插入边 深度优先遍历 递归 广度优先遍历 队列实
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-RC-u5 树与二分图

    2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 文章目录 2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 题目描述 输入格式 输出格式 输入样例 输出样例 思路 A
  • 层数最深的叶子节点之和

    题目描述 给你一棵二叉树的根节点 root 请你返回 层数最深的叶子节点的和 解题思路 使用深度优先搜索 全局维护两个变量sum 总和 以及maxdeep 最大深度 对于遍历到的节点有三种情况 1 此节点深度不够 不进行操作 遍历它的子节点
  • 深度优先搜索详解 C++实现

    DFS 全文大概四千字左右 如果您初学DFS相信会对您会有很大的帮助 能力有限 很多术语不够专业 理解万岁 二叉树的深度优先搜索 二叉树的概念这里就不细谈了 使用数组来存储二叉树 根结点从1开始 方便计算 设父节点的下标为n 那么左儿子的下
  • 2019年蓝桥杯省赛-数的分解

    题目 题目链接 题解 DFS 一定看清要求 3 个 不同 正整数 正整数中不能包括2和4 满足加法交换律的算式属于一种情况 代码 include
  • P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib【普及】

    USACO1 5 特殊的质数肋骨 Superprime Rib 题目描述 农民约翰的母牛总是产生最好的肋骨 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们 农民约翰确定他卖给买方的是真正的质数肋骨 是因为从右边开始切下肋骨 每次
  • 蓝桥杯 Day11 java组 DFS

    所谓暴力法 是把所有可能的情况都罗列出来 然后逐一检查 从中找到答案 暴力法往往是 低效 的代名词 不过相对其他 高效 算法 暴力法不仅简单且编码量一般都更短更好写 所以当拿到一个题目后 首先想想如何用暴力法解决 如果暴力法的代码能满足题目
  • 【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 MVP争夺战 知识点DFS搜索 时间限制 1s 空间限制 256MB 限定语言 不限 题目描
  • 【数据结构】多叉树的深度优先遍历DFS和广度优先遍历BFS(含C++递归和非递归方式实现)

    文章目录 前言 1 深度优先遍历 1 2 先序遍历 1 2 1 C 递归实现 1 2 2 C 非递归实现 1 2 后序遍历 1 2 1 C 递归实现 1 2 2 C 非递归实现 2 广度优先遍历 2 1 C 递归实现 2 2 C 非递归实现
  • DFS 刷题记录(laptop part)(2022.2.10)

    namespace matchstick my int isDividedby4 vector
  • 华为od机考真题-跳跃比赛

    def dfs nums i 0 if len nums lt i 1 return 0 return min dfs nums i j 1
  • 2023省赛 飞机降落(dfs)

    看数据量 fact 10 3628800 直接暴力dfs include
  • 二叉树的先序,中序,后序遍历

    java 二叉树的先序 中序 后序遍历 一 前序遍历 访问顺序 先根节点 再左子树 最后右子树 上图的访问结果为 GDAFEMHZ 1 递归实现 public void preOrderTraverse1 TreeNode root if
  • 考研机试题 -- DFS、模拟、递推、BFS

    目录 全排列 DFS 八皇后 DFS 反序输出 模拟 特殊乘法 模拟 众数 模拟 吃糖果 模拟 递推数列 递推 玛雅人的密码 BFS 全排列 DFS https www noobdream com DreamJudge Issue page
  • 数据结构——图的深度优先遍历(DFS)

    本文内图的存储方式是邻接矩阵 FS的遍历方法可以类比树的先序遍历 在实现树的先序遍历时 遍历顺序是 根 子树 下一个子树 而DFS的实现方法是优先深度 与一个树按照先序遍历的顺序相同 所以在实现DFS之前 需要先学习 寻找第一个邻接点 Fi
  • Permutation 和 Combination

    文章目录 Permutation 代码 代码核心思路 Combination 代码 代码核心思路 总结 Permutation 和 Combination是算法中非常常见的两种数据的排列方式 也就是数学中的排列和组合 Permutation
  • 邻接矩阵实现的带权有向图(C++)

    邻接矩阵实现的带权有向图 C 相关概念 定义和声明 实现 1 距离无穷大的定义 2 构造函数 3 深度优先遍历 4 广度优先遍历 6 将邻接矩阵转换为邻接表 7 重载 lt lt 运算符 打印输出 测试 测试代码 测试结果 源代码 相关概念
  • 力扣面试题 16.19. 水域大小(java DFS解法)

    Problem 面试题 16 19 水域大小 文章目录 题目描述 思路 解题方法 复杂度 Code 题目描述 思路 该问题可以归纳为一类 遍历二维矩阵 的题目 此类中的一部分题目可以利用 DFS 来解决 具体到本题目 该题目可以的写法大体不

随机推荐

  • 3阶Hermitian正定矩阵Cholesky分解通用表达式

    pdf文件 算法原理 将一个 n n n阶Hermitian正定矩阵 A A A分解为一个下三角矩阵 L L
  • java拦截通过url访问页面,必须通过登录页面访问目标页面

    在web xml中配置过滤
  • ROS AGV 笔记

    Ubuntu18 04 install of ROS Melodic 1 Installation 1 1 Configure your Ubuntu repositories 1 2 Setup your sources list sud
  • STM32_USART

    1 时钟使能 RCC APB2PeriphClockCmd RCC APB2Periph USART1 RCC APB2Periph GPIOA ENABLE USART1 GPIOA 2 引脚配置 GPIO InitTypeDef GPI
  • 二叉树的层序遍历(广度优先遍历)

    二叉树的层序遍历 Name 二叉树的层序遍历 Copyright Author lkm Date 01 04 22 21 47 include
  • Web开发权威指南笔记(三)

    书 Web开发权威指南 美 Chris Aquino Todd Gandee著 为3rd实战项目Chattrbox练习以及代码整理 全为个人借鉴本书产出 若需要转载请联系通知我 请尊重原创 谢谢 整理了大概8天了 内容比较多 很多重点都整理
  • Eigen: C++开源矩阵计算工具——Eigen的简单用法

    Eigen非常方便矩阵操作 当然它的功能不止如此 由于本人只用到了它的矩阵相关操作 所以这里只给出了它的一些矩阵相关的简单用法 以方便快速入门 矩阵操作在算法研究过程中 非常重要 例如在图像处理中二维高斯拟合求取光斑中心时使用Eigen提供
  • Android优秀开源项目汇总

    UI相关 图片 Android Universal Image Loader com nostra13 universalimageloader 异步加载 缓存 显示图片 ImageLoader com novoda imageloader
  • multipartFile.getOriginalFilename();不能获取原文件名称,也就是含有路径名

    一直在debug 发现只能获取文件名 进去看源代码 翻译过来就是 返回客户端文件系统中的原始文件名 p 这可能包含路径信息 取决于所使用的浏览器 但它通常不会与opera浏览器有关 只是可能包含路径名 所以我试了360浏览器 谷歌 火狐都只
  • 进程和线程的区别和联系

    一 简介 进程 进程是操作系统资源分配的基本单位 进程是指正在运行的程序实例 每个进程都有自己的内存空间 代码 数据和资源 操作系统通过管理进程来控制计算机的资源分配 每个进程都有一个唯一的标识符 称为进程 ID 以便操作系统可以识别和管理
  • Adapter 适配器基础讲解

    Adapter 适配器基础讲解 1 MVC模式的简单理解 在开始学习 Adapter 之前我们要来了解下这个 MVC 模式概念 举个例子 大型的商业程序通常由多人一同开 发完成 比如有人负责操作接口的规划与设计 有人负责程序代码的编写如果要
  • 表情包(图片)自生产——Python爬虫xpath实现

    文章目录 严正声明 爬虫应严格遵守国家的相关法律法规 坚决做一只文明爬虫 前言 一 知识准备 二 功能解析与实现 1 引入库 2 请求准备 3 发起请求 4 数据解析 5 数据保存 6 成果展示 三 普通代码展示 四 封装代码展示 总结 严
  • 核心基础知识1

    图片相关 安卓选择ETC2 8bit 苹果选择ETC PVRTC 4 bit RGBA32 32代表RGBA4个通道总共32位 每一个通道是8位 通常图片的格式有jpg和png jpg代表的是有损压缩无透明 png无损压缩有透明 显示同一张
  • 埋点--Vue前端通过自定义指令实现埋点功能

    需求 项目新版本新功能 需要再新页面添加埋点功能 记录用户的使用情况和使用习惯 因为前端项目使用的是Vue 所以选择使用Vue的自定义指令来实现埋点功能 埋点 主要记录 谁 什么时候 做了什么事情 直接上代码 1 自定义指令 import
  • HTML响应式Web设计

    目录 什么是响应式 Web 设计 创建自己的响应式设计 使用 Bootstrap 什么是响应式 Web 设计 RWD 指的是响应式 Web 设计 Responsive Web Design RWD 能够以可变尺寸传递网页 RWD 对于平板和
  • ARTS挑战打卡第十七周

    Algorithm 一周至少一道算法题 Review 阅读并点评至少一篇英文技术文章 Tip 学习至少一个技术技巧 总结和归纳在日常工作中所遇到的知识点 Share 分享一篇有观点和思考的技术文章 01 Algorthm https lee
  • xp系统开启iis服务器,WindowsXPHome版本安装IIS服务器方法

    首先在 开始 菜单的 运行 中输入 c Windows inf sysoc inf 系统会自动使用记事本打开sysoc inf这个文件 在sysoc inf中找到 Components 这一段 因为是XP简化版 所以里面东西很少 在里面加上
  • Tensorflow学习总结(1):CNN

    简介 CNN 卷积神经网络 是一种特殊的对图像识别的方式 属于非常有效的带有前向反馈的网络 CNN主要用于对二维图像的识别 它的网络结构对平移 比例放缩 倾斜或其他的变形具有高度不变性 因为 每层关注的特征不一样 贴近原图的 关注像素级别的
  • elasticsearch安装和使用

    一 全文检索基础 1 什么是全文检索 将 结构化数据中的 部分信息提取出来 重新组织 使其变得有 定结构 然后对此有 定结构的数 据进 搜索 从 达到搜索相对较快的 的 这部分从 结构化数据中提取出的然后重新组织的信息 我们称之索引 例如
  • 树状dp总结

    树的最长路径 树的最长路径 思路 每次都把每个点看成根节点之后进行向下进行遍历每次求最大 和次大值把他相加 不断进行搜索 include