牛客周赛 Round 15 D 游游的树上边染红(树形dp)

news/2024/7/20 20:48:12 标签: 深度优先, 图论, 算法

牛客周赛 Round 15 D 游游的树上边染红(树形dp)

在这里插入图片描述
一道很裸的树形dp,周日晚上看了一晚上看不懂,第二天突然就悟了。
题目跟没有上司从舞会很像,我们粗略的考虑,当前节点的状态为选/不选,然后根据此进行状态转移。

不选择当前点: d p [ u ] [ 0 ] dp[u][0] dp[u][0],表示我不选以节点 u 为上节点的边,那么对于 u 的所有子节点,我选择其状态的最大值即可。
即:
d p [ u ] [ 0 ] + = m a x ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) , v 为 u 的子节点 dp[u][0]+=max(dp[v][0],dp[v][1]),v为u的子节点 dp[u][0]+=max(dp[v][0],dp[v][1]),vu的子节点

选择当前点: d p [ u ] [ 1 ] dp[u][1] dp[u][1],表示我选择了以节点 u 为上节点的边,则需要去对 u 与其所有子节点的边进行遍历,取最大值即可。

d p [ x ] [ 1 ] = m a x ( d p [ x ] [ 1 ] , d p [ x ] [ 0 ] − m a x ( d p [ u ] [ 0 ] , d p [ u ] [ 1 ] ) + d p [ u ] [ 0 ] + w ) dp[x][1]=max(dp[x][1],dp[x][0]-max(dp[u][0],dp[u][1])+dp[u][0]+w) dp[x][1]=max(dp[x][1],dp[x][0]max(dp[u][0],dp[u][1])+dp[u][0]+w)

该方程的状态转移解释为:我若是选择了该边,那么对于子节点 v ,我只能取其不选的状态,即 d p [ v ] [ 0 ] dp[v][0] dp[v][0],而又因为我是选择的 u − v i u-v_i uvi这条边,所以不影响 u 对于其他边的选择,我只需要对其他子节点的状态依旧取 max 即可。

#include <bits/stdc++.h>

using namespace std;
const int N = 2e6 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"

int n;
vector<pll> e[N];

void add(int u,int v,int w)
{
	e[u].push_back({v,w});
	e[v].push_back({u,w});
}
ll dp[N][2];

void dfs(int x,int f)
{
	ll sum=0;
	for(auto [u,w]: e[x]){
		if(u!=f){
            dfs(u,x);
			dp[x][0]+=max(dp[u][0],dp[u][1]);
			//sum+=max(dp[u][0],dp[u][1]);
		}
	}
	for(auto [u,w]: e[x]){
        if(u!=f)
		dp[x][1]=max(dp[x][1],dp[x][0]-max(dp[u][0],dp[u][1])+dp[u][0]+w);
	}
    //cout<<dp[x][0]<<" "<<dp[x][1]<<endl;
}

void solve()
{	
	cin>>n;
	for(int i=1;i<=n-1;i++){
		ll u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dfs(1,-1);
	cout<<max(dp[1][0],dp[1][1])<<endl;
}

int main()
{
    ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	t=1;
	//cin>>t;
	while(t--){
		solve();
	}
    system("pause");
    return 0;
}

http://www.niftyadmin.cn/n/5094736.html

相关文章

竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

解决Maven依赖下载缓慢的问题(亲测管用)

解决Maven依赖下载缓慢 众所周知&#xff0c;欲练神功&#xff0c;必先自宫。最好的方式就是不用镜像&#xff0c;自己在本地下载一个稳定版本的Maven&#xff0c;以后每次用的时候直接在IDEA里面一导入就可以。&#xff08;为了保险&#xff0c;在以下的步骤里配置了aliyun镜像…

浅谈安科瑞多回路仪表在德国数据中心的应用

摘要&#xff1a;数据中心是一个聚集了大量服务器、存储设备、网络设备及配套UPS、空调等设备的IT设备场所&#xff0c;是实现数据信息的集中处理、存储、传输、交换和集中管理等业务的服务平台。 数据中心供电电源质量的好坏直接影响到IT设备的安全运行&#xff0c;因此对数据…

depcheck检查项目依赖的安装情况-帮你解决各种项目运行灵异事件

depcheck检查项目缺失的依赖 depcheck介绍与安装介绍安装 depcheck使用基础使用注意 进阶使用 删除多余的依赖注意 depcheck介绍与安装 介绍 工作中&#xff0c;以下的场景恐怕大家都有经历过&#xff1a; 从代码仓库上面 clone 的项目&#xff0c;自己本地一运行就报错… 用…

数学知识总结

素数 质数/素数定义 在大于1的整数中&#xff0c;如果只包含1和本身这两个约数&#xff0c;就被称为质数&#xff0c;或者叫素数 判断素数&#xff08;试除法&#xff09; 约数有一个重要的性质&#xff1a; 假设n代表数字&#xff0c;d代表n的一个约数 即d能整除n(d|n) 那么n…

SDK和API区别

B站视频&#xff1a;https://www.bilibili.com/video/BV1dA411K7Ps/?spm_id_from333.337.search-card.all.click&vd_source85701dd8aeeae2aaac0299ea796f19bb 假设你在开发一款移动端兽医诊所应用 Lets say youre developing a mobile app for a veterinarian clinic 想法…

MISRA C++:2023,您需要了解的下一个MISRA信息

MISRA C&#xff1a;2023是备受期待的MISRA C标准的下一个版本&#xff0c;预计将于今年晚些时候发布。这个新版本将整合AUTOSAR C 14指南&#xff0c;并支持最新版本的C。 MISRA的C和C编码指南不仅是汽车行业的最佳标准&#xff0c;也是使用嵌入式系统的任何行业的最佳标准。…

Java多线程间的通信:生产者消费者问题

逻辑分析 代码实现 package ThreadCommunction;import sun.security.krb5.internal.crypto.Des;import java.util.Date;//目标&#xff1a;了解线程通信 public class ThreadTest {public static void main(String[] args) {//需求&#xff1a;3个生产者线程&#xff0c;负责产…