【JZOJ3347】树的难题【树形dp】【拓扑排序】

基于云盾构建等保三级Web安全体系:从合规要求到实战落地 网络安全等级保护(等保)是保障信息系统安全的重要制度,其核心原理是通过分级防护、动态调整的策略,构建纵深防御体系。在技术层面,等保要求覆盖物理环境、通信网络、区域边界、计算环境和安全管理中心等多个层面,旨在通过技术和管理相结合的方式,有效应对网络攻击和数据泄露风险。对于Web应用而言,满足等保三级要求具有极高的技术价值,它不仅是合规的刚性需求,更是提升业务系统整体安全水位、建立用户信任、保障业务连续性的关键工程实践。在云计算时代,利用云原生安全服务(如Web应用防火墙WAF、云安全中心、态势感知等)可以高效 阅读详情

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3347
在这里插入图片描述


思路:

设 f [ x ] f[x] f[x]表示以 x x x为根的子树中,满足有0个黑色点,若干个白色点的最少切割次数; g [ x ] g[x] g[x]表示以 x x x为根的子树中,满足有若干个黑色点,0个白色点的最少切割次数; h [ x ] h[x] h[x]表示以 x x x为根的子树中,满足有若干个黑色点,1个白色点的最少切割次数。 i i i为 x x x的儿子。

  • 如果 x x x是黑色的
    1. f [ x ] f[x] f[x]需要满足没有黑色节点,显然不满足。
    2. g [ x ] = ∑ i m i n ( f [ v ] + e [ i ] . d i s , g [ v ] , h [ v ] + e [ i ] . d i s ) g[x]=\sum^i min(f[v]+e[i].dis,g[v],h[v]+e[i].dis) g[x]=∑imin(f[v]+e[i].dis,g[v],h[v]+e[i].dis)
    3. h [ x ] = m i n ( h [ u ] , h [ v ] + g [ u ] − m i n n ( f [ v ] + e [ i ] . d i s , g [ v ] , h [ v ] + e [ i ] . d i s ) ) h[x]=min(h[u],h[v]+g[u]-minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis)) h[x]=min(h[u],h[v]+g[u]−minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis))
  • 如果 x x x是白色的
    1. f [ x ] = ∑ i m i n ( f [ v ] , g [ v ] + e [ i ] . d i s , h [ v ] + e [ i ] . d i s ) f[x]=\sum^i min(f[v],g[v]+e[i].dis,h[v]+e[i].dis) f[x]=∑imin(f[v],g[v]+e[i].dis,h[v]+e[i].dis)
    2. g [ x ] g[x] g[x]显然不满足
    3. h [ x ] = ∑ i m i n ( f [ v ] + e [ i ] . d i s , g [ v ] , h [ v ] + e [ i ] . d i s ) h[x]=\sum^i min(f[v]+e[i].dis,g[v],h[v]+e[i].dis) h[x]=∑imin(f[v]+e[i].dis,g[v],h[v]+e[i].dis)
  • 如果 x x x是灰色的
    1. f [ x ] = ∑ i m i n ( f [ v ] , g [ v ] + e [ i ] . d i s , h [ v ] + e [ i ] . d i s ) f[x]=\sum^i min(f[v],g[v]+e[i].dis,h[v]+e[i].dis) f[x]=∑imin(f[v],g[v]+e[i].dis,h[v]+e[i].dis)
    2. g [ x ] = ∑ i m i n ( f [ v ] + e [ i ] . d i s , g [ v ] , h [ v ] + e [ i ] . d i s ) g[x]=\sum^i min(f[v]+e[i].dis,g[v],h[v]+e[i].dis) g[x]=∑imin(f[v]+e[i].dis,g[v],h[v]+e[i].dis)
    3. h [ x ] = m i n ( h [ u ] , h [ v ] + g [ u ] − m i n n ( f [ v ] + e [ i ] . d i s , g [ v ] , h [ v ] + e [ i ] . d i s ) ) h[x]=min(h[u],h[v]+g[u]-minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis)) h[x]=min(h[u],h[v]+g[u]−minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis))

还是比较好推的。毕竟除了设状态以外都是自己推的。
代码又长又丑,恶心死了。听说普通的 d p dp dp会爆栈,还敲了一个 t o p s o r t topsort topsort来 b f s bfs bfs做 d p dp dp,而且 t o p s o r t topsort topsort和 b f s bfs bfs还是一起进行的。。。
时间复杂度 O ( T n ) O(Tn) O(Tn)


代码:

#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;

const int N=300010;
const ll Inf=1e17;
int T,n,tot,root,head[N],col[N],in[N];
ll f[N],g[N],h[N];

struct edge
{
	int next,to;
	ll dis;
}e[N*2];

int read()
{
	int d=0;
	char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch))
		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

ll minn(ll x,ll y,ll z)
{
	return min(x,min(y,z));
}

void add(int from,int to,ll dis)
{
	e[++tot].to=to;
	e[tot].dis=dis;
	e[tot].next=head[from];
	head[from]=tot;
}

void dp()
{
	queue<int> q;
	for (int i=1;i<=n;i++)
		if (in[i]==1) q.push(i);
	while (q.size())
	{
		int u=q.front();
		q.pop();
		root=u;
		in[u]=0;
		
		if (col[u]==0)
		{
			f[u]=Inf;
			for (int i=head[u];~i;i=e[i].next)
			{
				int v=e[i].to;
				if (!in[v]) g[u]+=minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis);
			}
			for (int i=head[u];~i;i=e[i].next)
			{
				int v=e[i].to;
				if (!in[v]) h[u]=min(h[u],h[v]+g[u]-minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis));
			}
		}
		
		if (col[u]==1)
		{
			g[u]=Inf;
			for (int i=head[u];~i;i=e[i].next)
			{
				int v=e[i].to;
				if (!in[v])
				{
					f[u]+=minn(f[v],g[v]+e[i].dis,h[v]+e[i].dis);
					h[u]+=minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis);
				}
			}
		}
		
		if (col[u]==2)
		{
			for (int i=head[u];~i;i=e[i].next)
			{
				int v=e[i].to;
				if (!in[v])
				{
					f[u]+=minn(f[v],g[v]+e[i].dis,h[v]+e[i].dis);
					g[u]+=minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis);
				}
			}
			for (int i=head[u];~i;i=e[i].next)
			{
				int v=e[i].to;
				if (!in[v]) h[u]=min(h[u],h[v]+g[u]-minn(f[v]+e[i].dis,g[v],h[v]+e[i].dis));
			}
		}
		
		for (int i=head[u];~i;i=e[i].next)
		{
			int v=e[i].to;
			if (in[v]>1)
			{
				in[v]--;
				if (in[v]==1) q.push(v);
			}
		}
	}
}

int main()
{
	T=read();
	while (T--)
	{
		memset(head,-1,sizeof(head));
		memset(in,0,sizeof(in));
		tot=0;
		n=read();
		for (int i=1;i<=n;i++)
		{
			col[i]=read();
			if (col[i]==0) f[i]=Inf,g[i]=0,h[i]=Inf;
			if (col[i]==1) f[i]=0,g[i]=Inf,h[i]=0;
			if (col[i]==2) f[i]=0,g[i]=0,h[i]=Inf;
		}
		for (int i=1,x,y,z;i<n;i++)
		{
			x=read(); y=read(); z=read();
			add(x,y,(ll)z); add(y,x,(ll)z);
			in[x]++; in[y]++;
		}
		dp();
		printf("%lld\n",minn(f[root],g[root],h[root]));
	}
	return 0;
}
Plecs电力电子仿真专业教程-第一季 补充课程 Plecs的安装教程与软件下载 PLECS4.1.64免安装版本–点我下载 Plecs.Standalone-3.7.2版本--关注加私信给我可以提供下载链接 补充课程 Plecs的安装教程与软件下载 详细介绍Plecs软件的安装过程 阅读详情

相关推荐

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 553

树形dp问题

tree-dp

weixin_61819021的博客 643

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 733

BZOJ.3257.树的难题(树形DP)

题目链接 状态只与黑、白两点的颜色有关,于是用 \(f[x][i][j]\)表示当前以x为根节点,有\(i\)个黑点\(j\)个白点,使得x子树满足该条件的最小花费。 最后答案就是 \(min\{f[root][0][j],f[root][i][0/1]\}\)。 把 \(i\geq 1\)的状态都看做 \(i=1\),\(j\geq 2\)的状态都看做 \(j=2\). 更新顺序同树上背包一样,...

weixin_30819163的博客 192

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 425

手把手教你编写I2C读写EEPROM代码(驱动层实现)

从底层寄存器配置到时序控制,详解如何编写可移植的I2C读写EEPROM代码,覆盖起始信号、地址帧、数据收发及ACK应答等关键环节,确保在STM32、ESP32等主流平台稳定运行,真正落地i2c读写eeprom代码需求。

weixin_35756130的博客 505

树形dp问题分类【习题集】

最近捕捉到两只相似度很高的一类树上dp问题,一题是CF1092F:传送门,另一题是2018重庆市赛的一个题目:传送门:传送门 相似性:都需要求树上每一个点的一个结果,而这个结果都是与其他每一个点(或边)的属性相关联,直接看题吧 F. Tree with Maximum Cost time limit per test:2 seconds memory limit per test:256 mega...

wzw 778

TDR阻抗会爬坡? 别担心,不是你的错,你只是不够了解TDR!

TDR除了可以单靠一个Port就得到通道的阻抗外,其实也可以拿来计算传输线的Delay,或是两两对象之间的距离,甚至是拿来求得等效介电常数!

jkh920184196的博客 2159

jzoj4272-序章-弗兰德的秘密【树形dp】

正题 大意 两棵树,它们的相似值是它们留下最多的节点使它们的结构相同。求相似值。 这两颗树就是结构相同的,相似值是8。 解题思路 就是树形dp。可以用f[i][j]f[i][j]f[i][j]表示树1的第iii号节点和它的子树与树2的jjj号节点与它的子树的相似值,然后每个叶子节点的相似值就是1,然后每两个非子节点的相似值就是它们的子节点之间相互匹配的最大价值,由于数据较...

QuantAsk 687

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2294

USLE模型(1.2):LS因子的计算

基于USLE的甘南川西北土壤侵蚀研究。准备好30米分辨率的dem。

所有专家都曾始于新手 3481

[树形DP]JZOJ 3347 树的难题

Description Input 输入文件 为split.in 。第一行 包含 一个正整数 T,表示有T组测试数据 。接下来 依次是 T组测试数 据。每组测试数 据的第一行包含个正整数N。第二行包含 N个 0、1、2之一 的整数,依次 表示点 1到点 N的颜色。其中0表示黑色, 1表示白色, 2表示灰色。接下来 N-1行 ,每行为三个整数 ui、vi、ci...

weixin_30824479的博客 164

54、生物神经网络建模全解析

本文系统解析了生物神经网络的建模方法,涵盖从单个神经元到神经网络的多个时空尺度。首先介绍神经元层面的生物物理模型(如霍奇金-赫胥黎模型和多隔室模型)与多种简化模型(如菲茨休-纳古莫、莫里斯-勒卡尔、积分发放模型等),并分析其适用场景。随后探讨突触层面的信号传递机制,对比电突触与化学突触在结构、传输速度和方向上的差异,阐述其在神经网络建模中的理论意义。文章旨在为理解神经系统的信息处理机制、构建受生物启发的人工智能模型提供理论基础。

app77的博客 76

[bzoj 3257][jzoj 3347] 树的难题 {拓扑排序+树形dp}

题目 https://www.lydsy.com/JudgeOnline/problem.php?id=3257 解题思路 设f[x]f[x]f[x]表示以xxx为根的子树中,满足有0个黑色点,若干个白色点的最少切割次数;g[x]g[x]g[x]表示以xxx为根的子树中,满足有若干个黑色点,0个白色点的最少切割次数;h[x]h[x]h[x]表示以xxx为根的子树中,满足有若干个黑色点,1个白色点...

Nowed 561

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jzoj3347,bzoj3257-[NOI2013模拟]树的难题【树形dp】

正题 BZOJBZOJBZOJ题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3257 题目大意 一棵树上的节点有333种颜色,有边权。 选择一些边割掉使得森林中每棵树只有一个白点或没有黑点。 求割掉的边的最小值。 解题思路 定义fi,statef_{i,state}fi,state​表示iii的子树中割掉后森林所有的树都满足条件且目...

QuantAsk 563

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2019.07.10【NOIP提高组】模拟 A 组

题目 [bzoj 3257][jzoj 3347] 树的难题 {拓扑排序+树形dp} 感觉早上就没有好好做比赛。

Nowed 365

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jzoj3914-人品问题【树形dp】

正题 题目大意 一棵树每个点有权值,选择kkk个点,要求选子节点之前必须要选父节点。求最大权值。 解题思路 树形背包限制一下必须选kkk个就好了 codecodecode #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;cstring&gt; #define N 110 using namespace std; str...

QuantAsk 604

bzoj3257 树的难题(树形DP)

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

逝者如斯夫,不舍昼夜 615

Codeforces 919D 拓扑排序+树形dp

You are given agraph with n nodes and m directed edges. One lowercase letter is assigned to each node. We define a path'svalue as the number of the most frequently occurring letter. For example, ...

azbjwor1424的博客 193

【树形dp】JZOJ_3347 树的难题

题意 给出一个节点数为NNN的无根树,每个点有白、黑、灰三个颜色。 去掉一些边使得剩下的分割的集合满足: 1、1、1、不含有黑色节点 2、、、含有至多一个白色节点 求出去掉的边的最小边权和。 思路 显然树形dpdpdp。 dfsdfsdfs会爆炸,用bfsbfsbfs进行类似拓扑一样的顺序进行dpdpdp。 代码 #include<queue> #include<cstdio&...

GOODPLACE 259

树的深度、重心、连通块划分、拓扑排序、直径

一、树的深度:   树中各个节点的深度是一种自顶向下的统计信息。起初,我们已知根节点的深度为0。若节点x的深度为d(x),则它的子节点y的深度就是d(y)=d(x)+1。在深度优先遍历的过程中结合自顶向下的递推,就可以求出每个节点的深度d。 void dfs(int x) { v[x]=1; for(int i=head[x];i;i=nt[x]) { in...

_Griefs 1152

树形dp问题(持续更新中...)

hdu 1561 代码: #include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; const int M = 220; int n, m, v[M]; vector<int>son[M]; int dp[M][M];void dfs(int num, int le

long-long-ago 457

NOIP提高组【JZOJ4814】tree

Description给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1。每个结点上有一个物品,第i 个结点上的物品价值为vi。你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的路径上所有的点都被选中,并且选中结点的个数不能超过给定的上限lim。在此前提下,你需要最大化选中结点上物品的价值之和。求这个最大的价值之和。Data Constraint对于前20% 的数

dance in th dark的博客 503

POJ 2152 Fire 很难的树形DP

题意:有N个城市,连接这些城市的道路组成了一个树形的结构。现在想在一些城市建立消防站。如果选择在城市i建立消防站,需要的费用是w i  w_i,这个消防站负责该城市的防火工作。如果不选择建立消防站,那在距离为d i  d_i的范围内要有一个消防站来负责城市i的防火工作。现在想让所有城市都能保证安全,求最小的费用。 思路:想了很长时间,以为和前面的独立集是相关的,但是怎么也想不出来。。就去搜题解了。

leodestiny 1286

jzoj3555 树的直径

Description科学家在观测一棵大树,这棵树在不断地生长,科学家给这棵树的每个节点编了号。开始的时候,这棵树很小只有4个节点,一号点为根,其他三个节点挂在上面。 在接下来的M次观察中,科学家每次都能看见这棵树从叶子处长出新的两个节点来。如果当前这棵树有N个节点,那么这棵树的新的两个节点的编号分别为N+1,N+2。科学家记录下了这棵树生长的过程,需要你帮着计算这棵树实时的直径。树的直径就是这棵

ChickenT的博客 308
上一篇: 【JZOJ3379】查询【主席树】
下一篇: 【JZOJ3348】秘密任务【网络流】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值