Codeforces 1850H:The Third Letter 带权并查集
1850H.The Third Letter
Description:
- \(n\) 个人,\(m\) 个条件,每次给出两个人 \(a_i\) 和 \(b_i\) 一维的位置关系,以距离 \(d_i\) 表示,其正负表示方位的前后,判断这 \(m\) 个条件是否矛盾。(不同的人可以在横轴上位于同一点)
Analysis:
- 将所有的横轴位置抽象为一个点,用带权并查集维护点与点之间的链接关系。
- 对于一般的并查集来说,可以维护集合内的联通关系,进而求解不同集合之间的问题(如计数等)或判断图的联通性。带权并查集主打一个边权的维护(即额外的信息)。
- 路径压缩是 \(DSU\) 的重要一环,相当于建立起每个子节点和根节点的直接关系,这便优化了查找效率,无须从某一节点持续向上递归(一旦树退化成了一条链,岂不是寄了!!)
int find(int x) {
if(x != fa[x]) fa[x] = find(fa[x]);
return fa[x];
// return fa[x] = find(fa[x])
}
- 那带权并查集呢?注意,我们要维护的不是题中所给的 \(d\),而是要动态维护起每个点到其父节点(在路径压缩下也就是根节点)的 \(w[i]\),这里就产生了对根节点有影响的两个过程:
- \(find\)(\(x\))过程:因路径压缩,节点 \(x\) 原来的 \(fa[x]\) 更新为根节点,那么 \(w[x]\) 记录的子节点到父节点的距离 也要相应更新为到根节点(也就是新的父节点)
- 合并过程:因集合合并,两个集合各自的根节点变为一个大集合的一个根节点,自然而然,其中一个集合要进行权值的更新。


Solution:
int fa[maxn];
ll w[maxn];
int find(int x) {
if(x != fa[x]) {
// 记录原来的父节点,从而记录原来的父节点 t 到根节点的距离w[t]
int t = fa[x];
fa[x] = find(fa[x]);
w[x] += w[t]; // 路径压缩的权值更新
}
return fa[x];
}
void solve() {
int n,m; cin >> n >> m;
// 初始化
for(int i=1;i<=n;i++) {
fa[i] = i; // 我是我的父亲
w[i] = 0; // 到父节点(目前是自己)的距离
}
bool flag = true; // 标记目前是否已经出现矛盾
while(m--) {
int u,v; ll d;
cin >> u >> v >> d;
if(!flag) continue;
int fu = find(u);
int fv = find(v);
if(fu != fv) {
fa[fu] = fv;
w[fu] = d + w[v] - w[u]; //集合合并的权值更新
}
else { // fu == fv 说明二者距离可求,与所给的d比较即可
if(w[u] - w[v] != d) flag = false;
}
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
Codeforces 1850H:The Third Letter 带权并查集的更多相关文章
- Codeforces 1499G - Graph Coloring(带权并查集+欧拉回路)
Codeforces 题面传送门 & 洛谷题面传送门 一道非常神仙的题 %%%%%%%%%%%% 首先看到这样的设问,做题数量多一点的同学不难想到这个题.事实上对于此题而言,题面中那个&quo ...
- codeforces 687D Dividing Kingdom II 带权并查集(dsu)
题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...
- Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集
C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...
- Codeforces Round #181 (Div. 2) B. Coach 带权并查集
B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...
- CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)
Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...
- Codeforces 1156D 带权并查集
题意:给你一颗树,树边的权值可能是0或1,问先走0边,再走1边,或者只走1边的路径有多少条? 思路:对于一个点,假设通过0边相连的点一共有x个(包括自己),通过1边相连的有y个(包括自己),那么对答案 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集
C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...
- 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)
F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...
- D. The Door Problem 带权并查集
http://codeforces.com/contest/776/problem/D 注意到每扇门都有两个东西和它连接着,那么,如果第i扇门的状态是1,也就是已经打开了,那么连接它的两个按钮的状态应 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
随机推荐
- 微信小程序搜索不到腾讯服务路线规划插件的解决方法
具体操作如下: 提示:主要内容都是按开发文档来写的 开发文档: 链接: https://lbs.qq.com/miniProgram/plugin/pluginGuide/routePlan 添加插件 ...
- PCI-5565系列反射内存卡 反射内存交换机
主要性能:1路发射,一路接收光纤高速网络2.125GHz.最大256个节点.在板128MByte SDRAM.光纤通讯协议不占用CPU资源.动态包长,每个包4 到 64 个字节.33MHz PCI 3 ...
- Kafka实时数据即席查询应用与实践
作者:vivo 互联网搜索团队- Deng Jie Kafka中的实时数据是以Topic的概念进行分类存储,而Topic的数据是有一定时效性的,比如保存24小时.36小时.48小时等.而在定位一些实时 ...
- Redis系列13:分布式锁实现
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- Docker-Compose快速搭建LNMP
Docker-Compose 1.安装Docker sudo apt -y install docker.io docker version 查看版本号 docker help 查看帮助文档 2.更换 ...
- C++容器(vector、deque、list、map)
(1) vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取). 数组尾部添加或删除元素非常迅速.但在中部或头部就比较费时. *代码演示:* 取: at在下标越界时会抛出异常 ...
- 【linux命令】最强大的编辑器vim用法简介(基础篇)
vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.它主要分为命令令行模式.插入模式和底行模式这三种,下面主要介绍一下这三种模式最简单常用的用法. 一.命令 ...
- Java使用数组存储成绩,输出成绩列表,总分,平均分
代码如下: public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out. ...
- AI作画本地搭建
前言 Novel AI (简称NAI)是一个线上的深度学习小说续写平台,而 NAI Diffusion 是 NAI 在2022年10月3日推出的基于 Stable Diffusion 算法的自动生成二 ...
- C# 集合类 入门
什么是集合类? 集合类的位置在System.Collections.Generic命名空间中. 在我看来,集合类和大学里<数据结构>中所学的各种结构很像.集合类中包含Queue<T& ...