【CodeForces - 1156D】0-1-Tree(树形dp)

【短路计算篇】短路电流计算详解:从理论到实践 短路电流是指在正常电路中电势不同的两点之间发生阻抗极小的故障而引起的过电流。短路时电流强度很大,可能达到额定电流的10-15倍,大容量电力系统中短路电流可达数万安。简单比喻:短路就像水管突然爆裂,水流瞬间增大很多倍,对管道系统造成巨大冲击。短路电流计算是电气系统设计中的基础性工作,关系到整个系统的安全运行。通过本文介绍的各种计算方法,工程师可以根据具体情况选择合适的方法进行准确计算。 阅读详情

You are given a tree (an undirected connected acyclic graph) consisting of n vertices and n−1 edges. A number is written on each edge, each number is either 0 (let’s call such edges 0-edges) or 1 (those are 1-edges).

Let’s call an ordered pair of vertices (x,y) (x≠y) valid if, while traversing the simple path from x to y, we never go through a 0-edge after going through a 1-edge. Your task is to calculate the number of valid pairs in the tree.

Input
The first line contains one integer n (2≤n≤200000) — the number of vertices in the tree.

Then n−1 lines follow, each denoting an edge of the tree. Each edge is represented by three integers xi, yi and ci (1≤xi,yi≤n, 0≤ci≤1, xi≠yi) — the vertices connected by this edge and the number written on it, respectively.

It is guaranteed that the given edges form a tree.

Output
Print one integer — the number of valid pairs of vertices.

Example
Input
7
2 1 1
3 2 0
4 2 1
5 2 0
6 7 1
7 2 1
Output
34
思路:
显然树形dp,一开始我以为只是求链都是黑色的路径的数量,发现这个怎么这么简单,发现读错了题,题目实际上求得是是黑白两条拼接的路径数,就是一侧都是白色,另一侧都是黑色,也可以全黑或者全白。
然后我设两个状态,就是全黑和全白,发现貌似还少了一些case,然后我就又设了一个上头是黑色,下面至少有一头白色。然后这个我在实际去写的时候,当在白边转移时,自然而想到少了另一个状态,就是上面是白色,下面至少有一头黑色。

回过头来看,其实发现,白色和黑色的地位是等价的,根据对称性,就应该能设计出偶数个状态,所有最终是4个状态,在转移时,遇到黑色和遇到白色,的转移方程也是对称的。

然后智商下线了,忘记把全黑和全白的情况乘二了。。。怎么算都还是少了。。。自己手动枚举样例发现和我做也是一样。。。对自己无语了。。。注意是ordered pair

状态:
f[u][0]f[u][0]f[u][0]为以u为子树的时候,u为端点,边全是白色的pair个数
f[u][1]f[u][1]f[u][1]为以u为子树的时候,u为端点,边全是黑色的pair个数
f[u][2]f[u][2]f[u][2]为以u为子树的时候,u为端点,靠近u一头边为白色,终点是白色的pair个数
f[u][3]f[u][3]f[u][3]为以u为子树的时候,u为端点,靠近u一头边为黑色,终点是黑色的pair个数

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
#include<vector>
#include<set>
#define INF 0x7f7f7f7f
#define maxx 200005
using namespace std;
typedef long long ll;
int head[maxx],to[maxx<<1],_next[maxx<<1],w[maxx<<1];
int edge;
void addEdge(int x,int y,int c)
{
    to[++edge]=y,w[edge]=c,_next[edge]=head[x],head[x]=edge;
    to[++edge]=x,w[edge]=c,_next[edge]=head[y],head[y]=edge;
}
int f[maxx][4];
int n;
ll ans=0;
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        if(v==fa)continue;
        dfs(v,u);
        if(w[i])
        {
            ans+=(ll)2*f[u][1]*(f[v][1]+1);
            ans+=(ll)(f[u][0]+f[u][3])*(f[v][1]+1);
            ans+=(ll)f[u][1]*(f[v][0]+f[v][3]);

            f[u][1]+=f[v][1]+1;
            f[u][3]+=f[v][3];
            f[u][3]+=f[v][0];
        }
        else
        {
            ans+=(ll)2*f[u][0]*(f[v][0]+1);
            ans+=(ll)(f[u][1]+f[u][2])*(f[v][0]+1);
            ans+=(ll)f[u][0]*(f[v][1]+f[v][2]);

            f[u][0]+=f[v][0]+1;
            f[u][2]+=f[v][2];
            f[u][2]+=f[v][1];

        }
    }
    ans+=2*f[u][0];
    ans+=2*f[u][1];
    ans+=f[u][2];
    ans+=f[u][3];
}
int main()
{
    cin>>n;
    int x,y,c;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        addEdge(x,y,c);
    }
    dfs(1,0);
    cout<<ans<<endl;
    return 0;
}

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化 饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。 阅读详情

相关推荐

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

CodeForces 1156 D.0-1-Tree(并查集)

D.0-1-Tree You are given a tree (an undirected connected acyclic graph) consisting of n vertices and n−1 edges. A number is written on each edge, each number is either 0 (let’s call such edges 0-edges...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 334

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

Codeforces D. 0-1-Tree (树形dp)

https://codeforces.com/contest/1156/problem/D 题意:给你一颗树,同时给每一条边定义一个属性0和1,定义(x,y)表示x到y,其中我们经过1边后不能经过0边,求有多少对(x,y); 做法:本蒟蒻只想得到树形dp的想法,想不到大佬的并查集方法。dp[u][4],分别定义了u和他子树的四种状态。如下图 dp[u][0]表示u的子树中全部是0连在一起的个...

KXL5180的博客 1303

【面试题】MySQL索引相关的面试题(红黑树,hash,B树,B+树)

自己整理了几个面试题分享给大家 问题1:红黑树为什么那样设计? 首先聊一下二叉搜索树,主要特点是左节点比根节点小,右节点比根节点大,并且左右子树都是二叉搜索树。缺点是在极端情况下,比如插入都是有序的,就会出现退化的情况有序序列树退化成链表。 二叉搜索树 退化成链表的二叉搜索树 此时,要想让树的节点平均分布就需要平衡树了,红黑树就是平衡树的一种(平衡二叉搜索树)。然后,一棵树的查询性能取决...

Mr_黑_ 的博客 4044

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3326

D. 0-1-Tree(染色+计数)

题目 题意:     给定一棵带权树,权值为0或1。要求求出满足一下条件的点对(x,y)的数量。条件为从x到y的路径中不可以存在经过了权值为1的边然后再经过权值为0的边。     2≤n≤200000,1≤xi,yi≤n,0≤ci≤12≤n≤200000,1≤x_i,y_i≤n , 0≤c_i≤12≤n≤200000,1≤xi​,yi​≤n,0≤ci​≤1 分析:     经过分析,可以得到满足条...

weixin_44316314的博客 412

基于卷积神经网络的球罐结构损伤识别

球罐结构损伤识别方法研究 摘要:本研究针对球形储罐(球罐)结构健康监测需求,提出基于卷积神经网络(CNN)的损伤识别方法。通过ANSYS有限元仿真构建包含5种裂纹深度的500组振动信号数据集,设计包含卷积层、池化层和全连接层的CNN网络架构。实验结果表明,该方法在训练集和测试集上分别达到98.4%和96.0%的准确率,验证了其在球罐焊缝损伤识别中的有效性。研究提供了完整的MATLAB实现代码,为球罐结构智能化监测提供了技术参考。 关键词:球罐结构;卷积神经网络;损伤识别;振动信号;深度学习

AI的内部世界的博客 120

题解 [Codeforces1156D] 0-1-Tree

题目来源:Codeforces Educational Round #64tag:树形 DP,计数。

im_zyINF的博客 270

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1494

Python开发MCP Client

全部例子只是MCP Client访问MCP Server的过程,那么这样其实就失去了MCP协议的创建的初衷,和大模型集成后才能发挥MCP最大的作用。

Criss@陈磊 2973

和小公主一起学习Branch and Bound

应用场景主要是TSP,VRP相关的,参考了一些资料,在文末有参考链接,希望小白容易入门,如有侵权请私信联系。

dipsyliu549的博客 951

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 471

【Codeforces 1156D】 0-1-Tree 树形dp

题目大意: 给出一棵树,没条边具有边权0/1,求出真路径的数量 真路径(x,y):x->y的路径上,如果经过了1,则之后不能经过0 题目思路: 考虑最终合法的路径数量: 1000 000 111 由这几种路径数量去状态压缩:dp[i][k] 表示 从i节点出发状态为k的路径数量 状态转移方程的推法: 如果当前边为1,那么从该节点出发一定为10 11 与 00 01 无关 如果当前边为0,那么从该节点出发一定为00 01 与11 10 无关 最后考虑合并时产生的贡献(这个地方很复杂,

一只酷酷光儿的博客 598

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Codeforces Contest 1156 D 0-1-Tree ——树形DP

This way 题意: 给你一棵树,每个边都是1或者0,我们称<x,y>是有效的如果从x到y的路上如果经过1的边,那么在之后就不会经过0的边,问你有多少种有效的二元组,注意<x,y>与<y,x>是不一样的。 题解: 一眼题,几乎就是树形DP的模板。 总共大概分为4种状态: 00表示从这里开始连续的0的个数 01表示从这里开始连续的0之后连续1的个数 10表示这...

天翼之城的博客 174

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Codeforces 1156D 0-1-Tree ( 并查集 || 树形DP )

<题目链接> 题目大意: 给定一颗无向树,树的边权只要0/1两种情况,现在问你这棵树上存在多少对有序对<u,v>,满足u-->v的路径上,如果出现边权为1的边之后,就不能出现边权为0的边,问你这样的有序对的个数。 解题分析: 本题可以用并查集和树形DP来求解。 并查集就是用两类并查集来分别维护每个点所在的连通块0和连通块1的信息(连通块0表示之间的点都是通过...

weixin_30305735的博客 155

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Educational Codeforces Round 64 D. 0-1-Tree 树形dp or 并查集

题目链接: http://codeforces.com/contest/1156/problem/D 题意: 给你一棵树,树的边权为 000 或者 111 ,定义一个 pair&lt;a,b&gt;pair&lt;a,b&gt;pair<a,b> 对答案的贡献 +1+1+1, 当且仅当树上从 aaa 到 bbb 的路径上不存在经过了边权 111 之后又经...

人生如戏 208

codeforces1156D 0-1-Tree 并查集

题目传送门 题意:   给定一棵n个点的边权为0或1的树,一条合法的路径(x,y)(x≠y)满足,从x走到y,一旦经过边权为1的边,就不能再经过边权为0的边,求有多少边满足条件? 思路:   首先这道题,换根dp也可以过(树形dp,点这里)   那么如何并查集做呢,我们考虑一个点$u$,我们将与u通过0边相连的连通点的数量记做$siz0$,将与u通过1边相连的连通点的数量记做$...

weixin_30485379的博客 183

Codeforces 1156D 0-1-Tree(并查集)

传送门 题意:给一棵n个点,边被黑白染色的树,问有多少对点对满足从x沿最短路径走到y,经过白边(1-edges)后不经过黑边(0-edges)。 题解:开两个并查集,第一个只连黑边,第二个只连白边,讨论三种路径:①黑②白③黑转白。前两种在并查集merge的时候可以计算,第三种路径怎么搞?对于某个点x,经过它的第三种路径有条。为什么这么不会算重,因为树是没有环的(脑补一下似乎没毛病)。 做完发现可以不用讨论,直接。减去那个1就是去掉(pos, pos)这条路径。 WA了好久发现应该find的地方写成了

KGV093的博客 425

Educational Codeforces Round 64 (Rated for Div. 2) :D. 0-1-Tree (树形dp)

题目大意:给一棵只有0边权的树和1边权的树,问有多少个点对(x,y),使得从x到y的简单路径满足:一旦经过1边权的边,就不再经过1边权的边。 解法:树形dp或树分治 这题一看就是可以树形dp搞或树分治搞,树分治太麻烦了,又不好写,一般都用树形dp取代,除非万不得已。 考虑树形dp的做法:显然还是先对问题进行分解,把路径分成经过根节点的路径,dfs处理所有点为根节点的情况得到答案。考虑每一个子问题:...

qq_41997978的博客 193

Codeforces1156 D. 0-1-Tree 并查集

codeforces1156D 0-1-Tree 并查集 写法

qq_62853360的博客 315

1_最小高度树

class Solution { public: TreeNode* sortedArrayToBST(vector& nums) { return dfs(nums, 0, nums.size() - 1); } TreeNode* dfs(vector& nums, int l, int r) { if(l > r) return nullptr; int mid = l + r >> 1; TreeNode* root = new TreeNode(nums[mid]

南京师范大学中北学院 178

总结学习二叉树1-树的基本概念

二叉树的相关知识之前比较零碎的学习了一遍, 时间久了,对很多细节遗忘比较严重, 所以,详细总结一遍. 1. 树 1.1 树的概念    结点 数据结构的基础, 是构成复制数据结构的基本单位.   树是一种非线性的数据结构,它是由n(n>0)个有限节点组成的具有层次结构的数据集合.叫做树是因为看起来像一颗倒挂的树(根朝上,叶朝下).当结点个数n 为0时, 称为 空(NULL)树. 任意一颗非空树具有以下特点: 1. 2. ...

weixin_42562387的博客 290

2200+专项:D. 0-1-Tree(树形dp)

原题: http://codeforces.com/problemset/problem/1156/D 题意: 给出一棵树,每条边有边权0或1,现在要找出有序对<x,y>的对数,满足要求:x到y的路径不能在遇到1后再遇到0。 解析: 显然只有四种状态:从上往下记录为1、0、10、01,那么用dp记录每个点的子树中,下面的点与之路径为对应情况的点数。 转移: 设dp[p][0]=0,dp...

QAQ 608

【红黑树学习-1】树是什么?

什么是树? 树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树有很多种,向上面的一个节点有多余两个的子节点的树,称为多路树,而每个节点最多只能有两个子节点的一种形式称为二叉树。 图1 图2 ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程.

计忆芳华的博客 510

树的学习1

树的存储方法比较多样。dad 数组存储图存储针对不同的题目,要选择效率较好的存储方法。

only_matthew的博客 277
上一篇: 【POJ - 2774】Long Long Message(后缀数组)
下一篇: 【CodeForces - 1149B】Three Religions(dp查询)
coldfresh
博客等级 码龄10年 107粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值