首页 > 其他分享 >树的难题

树的难题

时间:2024-09-06 11:04:03浏览次数:8  
标签:难题 黑色 子树内 min int 白色 dp

树的难题

题意

给出一个无根树。树有 \(N\) 个点,边有权值。每个点都有颜色,是黑色、白色、 灰色这三种颜色之一,称为一棵三色树。 可爱的 Alice 觉得,一个三色树为均衡的,当且仅当,树中不含有黑色结点 或者含有至多一个白色节点。然而,给出的三色树可能并不满足这个性质。 所以,Alice 打算删去若干条边使得形成的森林中每棵树都是均衡的,花费的代价等于删去的边的权值之和。请你计算需要花费的代价最小是多少。

思路

树形 dp,定义 \(dp_{i,0/1/2/3/4}\)。

\(0\) 表示子树内没有黑色也没有白色。

\(1\) 表示子树内没有黑色有一个白色。

\(2\) 表示子树内没有黑色有多个白色。

\(3\) 表示子树内有黑色没有白色。

\(4\) 表示子数内有黑色有一个白色。

分类讨论转移和边是否需要被删。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
// 0:无黑无白
// 1:无黑一白
// 2:无黑多白
// 3:有黑无白
// 4:有黑一白 
// 0:黑 1:白 2:灰
const int N = 3e5 + 5;
int n, tot, a[N]; 
ll dp[N][2][5];
vector <pair <int,int>> E[N];
void dfs(int x, int fa) {
	if (a[x] == 0) dp[x][0][0] = dp[x][0][1] = dp[x][0][2] = dp[x][1][0] = dp[x][1][1] = dp[x][1][2] = 1e18;
	if (a[x] == 1) dp[x][0][0] = dp[x][0][3] = dp[x][1][0] = dp[x][1][3] = 1e18;
	for (auto e : E[x]) {
		int y = e.first, z = e.second;
		if (y == fa) continue;
		dfs(y, x);
		if (a[x] == 2) dp[x][1][0] = dp[x][0][0] + min({dp[y][0][0], dp[y][0][1] + z, dp[y][0][2] + z, dp[y][0][3] + z, dp[y][0][4] + z});
		if (a[x] != 0) dp[x][1][1] = min({dp[x][0][1] + dp[y][0][0], dp[x][0][0] + dp[y][0][1], dp[x][0][1] + dp[y][0][2] + z, dp[x][0][1] + dp[y][0][3] + z, dp[x][0][1] + dp[y][0][4] + z});
		if (a[x] != 0) dp[x][1][2] = min({dp[x][0][2] + dp[y][0][0], dp[x][0][2] + dp[y][0][1], dp[x][0][2] + dp[y][0][2], dp[x][0][1] + dp[y][0][1], dp[x][0][1] + dp[y][0][2], dp[x][0][0] + dp[y][0][2], dp[x][0][2] + dp[y][0][3] + z, dp[x][0][2] + dp[y][0][4] + z});
		if (a[x] != 1) dp[x][1][3] = min({dp[x][0][3] + dp[y][0][0], dp[x][0][3] + dp[y][0][3], dp[x][0][0] + dp[y][0][3], dp[x][0][3] + dp[y][0][1] + z, dp[x][0][3] + dp[y][0][2] + z, dp[x][0][3] + dp[y][0][4] + z});
 		dp[x][1][4] = min({dp[x][0][4] + dp[y][0][0], dp[x][0][3] + dp[y][0][1], dp[x][0][3] + dp[y][0][4], dp[x][0][4] + dp[y][0][3], dp[x][0][4] + dp[y][0][2] + z, dp[x][0][4] + dp[y][0][4] + z, dp[x][0][4] + dp[y][0][1] + z});
		swap(dp[x][0], dp[x][1]);
	}
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i ++) cin >> a[i];
	for (int i = 1; i <= n; i ++) E[i].clear();
	for (int i = 1, u, v, w; i < n; i ++) {
		cin >> u >> v >> w;
		E[u].push_back({v, w});
		E[v].push_back({u, w});
	} 
	memset(dp, 0, sizeof(dp));
	dfs(1, 0);
	cout << min({dp[1][0][0], dp[1][0][1], dp[1][0][2], dp[1][0][3], dp[1][0][4]}) << "\n";
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int T;
	cin >> T;
	while (T --)
		solve();	 
	return 0;
}

标签:难题,黑色,子树内,min,int,白色,dp
From: https://www.cnblogs.com/maniubi/p/18399839

相关文章

  • 告别CAD运行难题:一键解决dbghelp.dll错误的方法
    当你在使用CAD(计算机辅助设计)软件时遇到dbghelp.dll错误,这可能会导致软件无法正常运行或频繁崩溃。不过,你不必过于担心,因为这个问题通常可以通过几种方法来解决。以下是一些简单而有效的方法,旨在帮助你一键解决dbghelp.dll错误。方法一:使用系统文件检查器(SFC)Windows操作系统......
  • 智能巡检管理系统,解决巡检难题的利器
    随着信息科技的快速发展,在各类工厂、企业以及大型设施场所中,巡检工作至关重要。巡检管理如同设备健康的守护者,时刻关注着每一个关键设备/区域的运行状态。然而,传统的设备/区域巡检全靠纸质单的方式,往往给管理人员带来了诸多难题。想象一下这样的场景:在一个大型工厂的车间里,巡检员们......
  • 2024.07.27科大讯飞(有困难题)
    1.购房之旅小强有n个朋友,每个朋友有一定数量的金币,现在他们要购买房子,一共有m个房子,每个房子有两个参数:舒适度和价格,当一个人的金币大于等于一个房子的价格时,才可以购买房子,且要满足以下条件:1.一个人至多购买一个房子。2.一个房子至多被一个人购买。现在小强想知道n个朋友购买的......
  • 攻破工程级复杂缓存难题--企业实战12
    缓存技术在现代分布式系统中至关重要,不仅提升了系统性能,还减轻了后端数据库的压力。然而,缓存系统也面临着诸多挑战,如缓存穿透、缓存雪崩、缓存击穿和热点key问题。通过多种策略的综合应用,包括本地缓存、双缓存方案、多级缓存、多副本、热点key拆分和动态分散等,可以有效应对这些......
  • 【Python-办公自动化】1秒解决海量查找替换难题
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
    ......
  • Stable diffusion难题攻克——提示词写作!手把手教你 !(附提示词库)
    解锁AI艺术创作的密码,让你的AI图像生成作品脱颖而出!StableDiffusion最强提示词手册StableDiffusion介绍OpenArt介绍提示词(Prompt)工程介绍…第一章、提示词格式提问引导示例单词的顺序…有需要的朋友,可以点击下方卡片免费领取!第二章、修饰词(Modifiers)Photog......
  • 加拿大本科留学遇到难题不能毕业走对流程才能解决问题
    加拿大本科留学遇到难题不能毕业走对流程才能解决问题加拿大是很多学生在出国留学之际都会选择的地方,但是随着留学人数增多,各大院校对于自身的教学质量也开始严格把关,对学生带来的一个影响就是毕业难度的问题。毕业影响因素多种多样,挂科、GPA不够、学分不够、出勤率太低、考试出现......
  • 好多kafka难题啊,看看其中的化解之道
    文末有面经共享群前面已经分享过几篇面试了,这是一篇关于更加面向项目和技术的面经详解,第一次遇见问那么多kafka的问题,看看这个粉丝是怎么回答的。先来看看职位描述:岗位职责:负责基于Go的后端服务的设计、开发和维护;参与系统架构设计,确保系统的高可用性、高性能和可扩展性;......
  • Kafka分布式集群部署实战:跨越理论,直击生产环境部署难题与解决方案,性能调优、监控与管
    本文介绍kafka的集群如何部署和安装,1-4章理论知识,第5章详解集群的部署,部署Kafka之前需要先部署好分布式的Zookeeper,不喜欢理论的可以直接看第5章,欢迎大家一起探讨技术!Zookeeper集群部署参考文章:精通Zookeeper:详解分布式集群部署全程,掌握数据一致性、选举机制与集群容错能力-......