树上dp学习总结2

news2025/1/9 15:00:29

今天也是侥幸刷了两道树上dp的问题,第一个还算简单,但是第二个真的可以说是我碰到的蓝题之首,做了一个晚上我只能留下了不争气的口水(太饿了,该吃夜宵了)

P1131 [ZJOI2007] 时态同步

 

 思路:一开始我想的是深搜一遍,然后求出每个节点到根节点的距离,然后找到最大值,然后求出所有的叶子结点和根结点的差值即可

但是这是不对的,因为如果这样会重复计算一些公共边,导致最后的结果产生错误 ,因此我们只需要每次将处理的叶子结点能够持平就可以了

如图所示

因此我们就可以写出代码

 

#include<bits/stdc++.h>
using namespace std;  
#define int long long 
vector<pair<int, int>> edges[500005]; 
int n, rt; 
long long f[500005], ans; 
 
void dfs(int v, int parent) 
{
    int len = edges[v].size();  
    for (int i = 0; i < len; i++) 
	{  
        int u = edges[v][i].first; 
        int weight = edges[v][i].second; 
        if (u == parent) continue; 
        dfs(u, v); 
        f[v]=max(f[v], f[u] + weight); //计算最大权重 
    }  
    for (int i = 0; i < len; i++) 
	{  
        int u = edges[v][i].first; 
        int weight = edges[v][i].second; 
        if (u == parent) continue; 
        ans += (f[v]-f[u]-weight); 
    }  
}  
signed main() 
{  
    cin >> n >> rt;  
    for (int i = 1; i < n; i++) 
	{  
        int a, b, c;  
        cin >> a >> b >> c; 
        edges[a].emplace_back(b, c); 
        edges[b].emplace_back(a, c); 
    }  
    dfs(rt,-1); 
    cout<<ans; 
    return 0;  
}

P2279 [HNOI2003] 消防局的设立

思路:这题是我真没想到的,巨难的题目,五个状态转移方程,看了大犇的代码才会写,只能说我还是个小蒟蒻

先来说一下状态转移数组的含义:

f[i][0]表示可以覆盖到从节点i向上2层的最小消防站个数
f[i][1]表示可以覆盖到从节点i向上1层的最小消防站个数
f[i][2]表示可以覆盖到从节点i向上0层的最小消防站个数
f[i][3]表示可以覆盖到从节点i向上-1层的最小消防站个数
f[i][4]表示可以覆盖到从节点i向上-2层的最小消防站个数 

什么叫做覆盖呢?就是说,确保消防站的覆盖范围可以覆盖到其层数以及其子树

比如说,f[ v ] [ 1]就是说要覆盖其父亲节点以及包括其自身的所有子树

f[ v ] [3] 就是要包含其儿子以及所有子孙的子树

因此我们可以找到状态转移方程

这里直接引用大犇说的话了,引用链接:大犇的题解文章 

 

因此我们就可以写出dfs函数,完成这道题了

#include<bits/stdc++.h>  
using namespace std;  
#define int long long   
int n;  
vector<int> G[1005]; 
int f[1005][5]; 
void dfs(int v) 
{  
    f[v][0] = 1;  
    f[v][3] = 0;  
    f[v][4] = 0;  
    for (int u:G[v]) 
	{  
        dfs(u);  
        f[v][0]+=f[u][4];  
        f[v][3]+=f[u][2];  
        f[v][4]+=f[u][3];  
    }  
    if (G[v].empty()) 
	{  
        f[v][1]=f[v][2]=1; 
    } 
	else 
	{  
        f[v][1]=f[v][2]=0x3f3f3f3f;  
        for(int i = 0;i<G[v].size();i++) 
		{  
            int u=G[v][i]; 
            int f1=f[u][0];  
            int f2=f[u][1];  
            for (int j=0;j<G[v].size();j++) 
			{  
                if (i == j) 
				continue;   
                int t=G[v][j]; //除了u外的别的子树 
                f1+=f[t][3];  
                f2+=f[t][2];  
            }  
            f[v][1]=min(f[v][1],f1);  
            f[v][2]=min(f[v][2],f2);  
        }  
    }  
    for(int i=1;i<=4;i++) 
	{  
        f[v][i]=min(f[v][i],f[v][i-1]);  
    }  
}  
signed main() 
{  
    cin>>n;  
    memset(f,0x3f3f3f3f,sizeof(f));
    for (int i=2;i<=n;i++) 
	{  
        int v;  
        cin>>v;  
        G[v].push_back(i);   
    }  
    dfs(1);  
    cout<<f[1][2]<<endl;  
    return 0;  
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)

若该文为原创文章&#xff0c;转载请注明原文出处。 一、SPI介绍 串行外设接口 (Serial Peripheral interface) 简称 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并 且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚。 …

Word如何设置表格内容的中文和英文字体

1、选中需要设置的表格内容。 2、CtrlD&#xff0c;分别设置中文和英文字体&#xff0c;点确定即可。 提升自己最好的方法就是改变坏习惯&#xff0c;改变坏习惯最好的方法找习惯替代它。坏习惯不改&#xff0c;你永远受到限制&#xff0c;只能原地踏步。To do list&#xf…

爬取指定的天气网站数据

目 录 一、引言 &#xff08;一&#xff09;项目背景 &#xff08;二&#xff09;目标与意义 二、数据获取与处理 &#xff08;一&#xff09;使用的库和模块 &#xff08;二&#xff09;获取天气信息的函数 &#xff08;三&#xff09;数据预处理 三、数据分析…

python np.max怎么用

python np.max的用法&#xff1a; 语法&#xff1a;np.max&#xff1a;(a, axisNone, outNone, keepdimsFalse) 求序列的最值&#xff1b; 最少接收一个参数&#xff1b; axis&#xff1a;默认为列向&#xff08;也即 axis0&#xff09;&#xff0c;axis 1 时为行方向的最…

SQL labs-SQL注入(七,sqlmap对于post传参方式的注入,2)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。参考&#xff1a;SQL注入之Header注入_sqlmap header注入-CSDN博客 序言&#xff1a; 本文主要讲解基于SQL labs靶场&#xff0c;sqlmap工具进行的post传参方式的SQL注入&#xff0c…

如何利用大语言模型进行半监督医学图像分割?这篇文章给出了答案

PS&#xff1a;写在前面&#xff0c;近期感谢很多小伙伴关注到我写的论文解读&#xff0c;我也会持续更新吖~同时希望大家多多支持本人的公主号~ 想了解更多医学图像论文资料请移步公主&#x1f478;号哦~~~后期将持续更新&#xff01;&#xff01; 关注我&#xff0c;让我们一…

大模型时代,编程已成为当代大中专学生的必备技能,如何选择编程语言的一些建议

目录 一、具体建议 1. 确定学习目标 &#xff08;1&#xff09;兴趣驱动 &#xff08;2&#xff09;职业规划 2. 评估市场需求 &#xff08;1&#xff09;行业趋势 &#xff08;2&#xff09;就业前景 3. 考虑应用领域 4. 学习资源 &#xff08;1&#xff09;查看官方文档…

idea 常用的快捷键大全 建议收藏!!

IDEA 一款非常优秀的开发工具&#xff0c;本篇博客总结一些在 IDEA 中常用的快捷键&#xff0c;旨在提高开发效率。点击File --> Settings --> keymap便可进入看到 IDEA 提供的快捷键&#xff0c;我们也可以搜索和自定义所有快捷键。下面给出的是IDEA常用操作归纳。 1、…

RK3568平台(触摸篇)串口触摸屏

一.什么是串口屏 串口屏&#xff0c;可组态方式二次开发的智能串口控制显示屏&#xff0c;是指带有串口通信的TFT彩色液晶屏显示控制模组。利用显示屏显示相关数据&#xff0c;通过触摸屏、按键、鼠标等输入单元写入参数或者输入操作指令&#xff0c;进而实现用户与机器进行信…

AI问答:理解CRLF和LF / 两者区别 / 在编程和文件处理中的影响

一、背景 vscode这里的CRLF&#xff0c;点击后有CRLF和LF的两个选项&#xff0c;本文我们理解CRLF 和 LF 二、理解CRLF和LF 2.1、CRLF&#xff1a;起源于早期的打字机和电传打字机&#xff0c;这些设备在打印完一行后&#xff0c;需要先将打印头移回到行首&#xff08;回车&…

【Java题解】杨辉三角—力扣

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 题目链接&#xff1a;杨辉三角 目录&#x1f451; ⭐题…

用60行python代码制作一个扫雷

扫雷游戏&#xff08;Minesweeper&#xff09;是一个经典的逻辑游戏&#xff0c;玩家需要在一个包含隐藏地雷的网格中标记出所有地雷的位置&#xff0c;同时避免触发它们。下面&#xff0c;我将提供一个简单的Python扫雷游戏实现&#xff0c;并附带详细的教程。 第一步&#x…

基于cubeMX的STM32的RTC实时时钟实现

1、在仪器仪表的项目开发中&#xff0c;时常需要设备显示当前的日期和时间&#xff0c;这时&#xff0c;可以使用STM32自带的RTC实时时钟模块来实现此功能。这里我们使用STM32F103RCT6单片机芯片为例。 2、cubeMX的设置 &#xff08;1&#xff09;RTC设置 &#xff08;2&…

第十六天内容

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12&#xff0c;开发者工具&#xff0c;网络 1、web基本概念 web服务器 &#xff08;web server&#xff09;&#xff1a;也称HTTP服务器&#xff08;HTTP server&…

在线PS懒人快速抠出透明背景(纯色背景+复杂背景抠图操作)

电脑硬盘快爆了&#xff0c;没必要安装个PS了&#xff0c;网上找了几个在线的PS网站&#xff0c;还别说&#xff0c;一般的PS操作都可以满足 我们使用PS通常用的较多的是抠背景操作吧&#xff0c;接下来演示几个在在线PS网站上进行抠背景操作 一、在线PS网站 Photopea&#x…

IDM2024免费绿色纯净下载器,速度提升的秘密!

Internet Download Manager&#xff08;简称IDM&#xff09;是一种高效的下载管理器&#xff0c;它支持多线程下载、断点续传等功能&#xff0c;能够提高下载速度和稳定性。在网络资源日益丰富的今天&#xff0c;一个好用的下载器对于用户来说是非常重要的。本文将介绍IDM的主要…

数据结构初阶(c语言)-排序算法

数据结构初阶我们需要了解掌握的几种排序算法(除了直接选择排序&#xff0c;这个原因我们后面介绍的时候会解释)如下&#xff1a; 其中的堆排序与冒泡排序我们在之前的文章中已经详细介绍过并对堆排序进行了一定的复杂度分析&#xff0c;所以这里我们不再过多介绍。 一&#x…

Redis的集群 高可用

文章目录 Redis基本概念主从复制哨兵模式故障切换集群 Redis基本概念 Redis集群三种模式 主从复制&#xff1a;奇数台 3&#xff1a; 一主两从 哨兵模式&#xff1a;3&#xff1a; 1主两从 cluster&#xff1a;6 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主…

log4j2漏洞练习(未完成)

log4j2 是Apache的一个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。apache log4j通过定义每一条日志信息的级别能够更加细致地控制日志生成地过程&#xff0c;受影响的版本…