Codeforces 1156D 0-1-Tree ( 并查集 || 树形DP )
<题目链接>
题目大意:
给定一颗无向树,树的边权只要0/1两种情况,现在问你这棵树上存在多少对有序对<u,v>,满足u-->v的路径上,如果出现边权为1的边之后,就不能出现边权为0的边,问你这样的有序对的个数。
解题分析:
本题可以用并查集和树形DP来求解。
并查集就是用两类并查集来分别维护每个点所在的连通块0和连通块1的信息(连通块0表示之间的点都是通过边权为0的边相连接,连通块1类似)。
然后对于每个点,考虑三种情况:
1)该点所在的连通块0的所有节点相互之间自行匹配,假设该点所在连通块0点数为sz,有序对数就是有向完全图的有向边边数$(sz*(sz-1))$(这种情况每个连通块0只需要考虑一次);
2)对于每个点所在连通块1的情况考虑,与上面类似;
3)每个点作为所在连通块0和1的交叉点,情况数就是 $(sz0-1)*(sz1-1)$。
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 2e5+;
ll sz[N][];
int n,fa[N][];
//第二维表示是第几类连通块,0表示边权为0的联通块,1表示边权为1的
int find(int u,int x){ return u==fa[u][x]?u:fa[u][x]=find(fa[u][x],x); } inline void Union(int u,int v,int x){
int f1=find(u,x),f2=find(v,x);
if(f1!=f2){
fa[f2][x]=f1;
sz[f1][x]+=sz[f2][x]; //记录连通块中的节点个数
}
}
int main(){
ios::sync_with_stdio(false);cin.tie();cout.tie();
cin>>n;
for(int i=;i<=n;i++){
sz[i][]=,sz[i][]=;
fa[i][]=i,fa[i][]=i;
}
for(int i=;i<n;i++){
int u,v,w;cin>>u>>v>>w;
Union(u,v,w); //将对应分类的连通块合并
}
ll ans=;
for(int i=;i<=n;i++){
if(fa[i][]==i)ans+=sz[i][]*(sz[i][]-); //讨论块内的有序对,有序对数就是有向完全图的边数
if(fa[i][]==i)ans+=sz[i][]*(sz[i][]-);
int f0=find(i,),f1=find(i,);
ans+=(sz[f0][]-)*(sz[f1][]-)*1LL; //然后将每个点作为两类连通块的交叉点的情况考虑一下
}cout<<ans<<endl;
}
树形DP做法待补:
Codeforces 1156D 0-1-Tree ( 并查集 || 树形DP )的更多相关文章
- hdu 4514 并查集+树形dp
		
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
 - Codeforces 699D Fix a Tree 并查集
		
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
 - HDU 5575 Discover Water Tank 并查集 树形DP
		
题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...
 - HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
		
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
 - BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集+树形DP
		
BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集. Description 奶牛们遭到了进攻!在他们的共和国里,有N(1 <= N <=50,000)个城市,由M(1 ...
 - P2700逐个击破(并查集/树形dp)
		
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
 - Codeforces Round #527 F - Tree with Maximum Cost /// 树形DP
		
题目大意: 给定一棵树 每个点都有点权 每条边的长度都为1 树上一点到另一点的距离为最短路经过的边的长度总和 树上一点到另一点的花费为距离乘另一点的点权 选定一点出发 使得其他点到该点的花费总和是最大 ...
 - Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
		
题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...
 - Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
		
D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
 
随机推荐
- SSM架构 (Spring 5.0.2)添加Jackson
			
第一步添加jsckson的包 <dependency> <groupId>javax.annotation</groupId> <artifactId> ...
 - Linux–Nginx攻略
			
什么是Nginx Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Ra ...
 - 【LGR-062】洛谷10月月赛 III div.2 (A-C)
			
前言 100+100+46+0=246pts 300多名 以后每次比赛都要有进步哦!qwq 小D与笔试 水题 Code #include<algorithm> #include<io ...
 - 前端面试题1(HTML篇)
			
HTML 语义化 HTML标签的语义化是指:通过使用包含语义的标签(如h1-h6)恰当地表示文档结构 css命名的语义化是指:为html标签添加有意义的class 为什么需要语义化: 去掉样式后页面呈 ...
 - 前端每日实战:98# 视频演示如何用纯 CSS 创作一只愤怒小鸟中的绿猪
			
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VBGWqX 可交互视频 此视频是可 ...
 - 035:DTL常用过滤器(4)
			
join过滤器: 类似与 Python 中的 join ,将列表/元组/字符串用指定的字符进行拼接.示例代码如下: {{ value|join:"/" }} 如果 value 是等 ...
 - vue的响应接口
			
Vue 可以添加数据动态响应接口. 例如以下实例,我们通过使用 $watch 属性来实现数据的监听,$watch 必须添加在 Vue 实例之外才能实现正确的响应. 实例中通过点击按钮自动加 1.set ...
 - 树上倍增 x
			
树上倍增. dfs序的做法: 思路: //f[i][j]表示dfs序中序号为i到序号为j的点之间深度最小的点的编号 dfs序[]//存0-...(id)编号 节点[]//存dfs序中所经过的节点号 d ...
 - Java后端进阶教程
			
https://www.cnblogs.com/caoleiCoding/p/6170555.html 传智播客Java Spring框架:https://www.bilibili.com/video ...
 - Android 中的 Matrix
			
Matrix 是 Android SDK 提供的一个矩阵类,它代表一个 3 X 3 的矩阵 Matrix主要可以对图像做4种基本变换 Translate 平移变换 Rotate 旋转变换 Scale ...